2010-08-20 2 views
0
struct a 
{ 
    int (*ptr1)(); 
    int (*ptr2)(); 
    int data; 
}; 

typedef struct 
{ 
    struct a x; 
}all; 

int fun1() 
{ 
    return 5; 
}; 

int fun2() 
{ 
    return 9; 
}; 

je peux assigner commeComment puis-je attribuer des valeurs à un des pointeurs de fonction des membres dans une structure

all *mem = (all*)malloc(sizeof(all)); 

mem->x.ptr1 = fun1; 
mem->x.ptr2 = fun2; 

est-il une autre façon d'attribuer ces pointeurs de fonction? Est-il possible d'attribuer comme ça?

all *mem; 

(void **)mem->ptr1[0] = fun1; 
(void **)mem->ptr2[1] = fun2; 
+0

Cela devrait fonctionner. Qu'est-ce qui ne va pas? Avez-vous un message d'erreur? Quel compilateur? – Patrick

+2

aussi, pourquoi voudriez-vous faire quelque chose comme ça? – Ben

+0

@Patrick Merci Patrick, Pourriez-vous s'il vous plaît expliquer ces déclarations? – Thangaraj

Répondre

5

Non, ce n'est pas possible (je suppose que vous avez réellement voulu dire ce qui suit, puisque votre code ne fait pas beaucoup de sens)

((void **)&mem->ptr1)[0]=fun1; 
((void **)&mem->ptr1)[1]=fun1; 

C'est syntaxiquement correct, mais en citant la norme C:

Il peut y avoir un remplissage sans nom dans un objet de structure, mais pas au début.

ce qui signifie que vous n'êtes pas garanti que ((void **)&mem->ptr1)+1 == ((void **)&mem->ptr2).

La déclaration que vous avez affichée

(void **)mem->ptr1[0] = fun1; 

signifie en fait

(void **)((mem->ptr1)[0]) = fun1; 

qui tente d'indexer une fonction pointeur.

Notez que toutes les références comme mem->ptr1 etc. devraient être mem->x.ptr1 selon vos définitions.

1

Non, vous ne pouvez pas affecter comme ceci pour de nombreuses raisons:

  1. pointeurs de fonction ne sont pas compatibles avec void*. votre compilateur peut permettre cela, mais ce comportement est non défini selon la norme
  2. En utilisant [0] et [1] vous êtes l'arithmétique des pointeurs doin't sur un pointeur void, ce qui est interdit non plus.

Toujours dans votre premier exemple qui fonctionne, vous affectez un pointeur à une fonction. C'est ok comme vous l'avez fait, car une fonction si vous ne mettez pas () après qu'elle évalue à son adresse. Mais encore, je trouve plus clair d'écrire &f dans un tel cas.

Questions connexes