Avec gcc 4.3.4, à l'aide de commutateurs -O2 -Wstrict-aliasing, dreamlax réponse produira:
warning: dereferencing type-punned pointer will break strict-aliasing rules
Ajouté: je pense que les objections à la caf réponse sur boutisme et la taille sont raisonnables, ce qui sa solution n'a pas d'adresse (no pun intended). Dustin suggestion pour l'utilisation d'une union fonte est probablement juridique (bien que de ce que j'ai lu il semble y avoir un débat, mais votre compilateur n'est important que la loi). Mais son code peut être simplifié (ou occulté, selon votre goût) par le one-liner:
printf("%p\n", ((union {int (*from)(void); void *to;})funcptr).to);
Cela supprime la gcc strict-aliasing avertissement (mais est-elle correcte?).
Agrégation des moulages de ne pas "travailler", si vous utilisez le pédant commutateur, ou à l'aide par exemple, SGI IRIX, de sorte que vous aurez besoin d'utiliser:
printf("%p\n", ((union {int (*from)(void); void *to;} *)&funcptr)->to);
Mais en ce qui concerne la question d'origine: elle trouve son origine dans l'utilisation de pédant, je pense que c'est un peu pédant :).
En outre edit: Remarque vous ne pouvez pas utiliser principal dans le dernier exemple, comme dans:
printf("%p\n", ((union {int (*from)(void); void *to;}) main).to); // ok
printf("%p\n", ((union {int (*from)(void); void *to;} *)&main)->to); // wrong!
parce que, naturellement, &main se désintègre au principal.