Décalage de utilisé sous Linux

Je passais en revue la façon dont l’offset d’une variable particulière est trouvé dans une structure donnée.

J’ai essayé le programme suivant.

struct info{ char a; int b; char c; int d; }; struct info myinfo; int main(int argc, char **argv) { struct info *ptr = &myinfo; unsigned int offset; offset = (unsigned int) &((struct info *) 0)->d; printf("Offset = %d\n",offset); return 0; } 

Je voulais juste savoir comment la ligne offset = (unsigned int) &((struct info *) 0)->d fonctionne. Je suis confus à cause du déréférencement de 0.

Il ne fait pas vraiment déréférencer 0 , bien que ça y ressemble. Il faut vraiment l’adresse d’un membre si elle a été déréférencée à l’adresse 0 , hypothétiquement.

C’est une sorte de sale bidouille (plus quelques trucs macro méchants), mais ça vous donne ce qui vous intéresse (le décalage du membre dans la structure).

Une façon plus “correcte” de faire la même chose serait de générer un object valide, de prendre son adresse et de prendre l’adresse du membre, puis de les soustraire. Faire la même chose avec un pointeur nul n’est pas beau, mais fonctionne sans créer d’object et ne rien soustraire.

Vous n’effectuez pas de déréférencement de 0. Vous ajoutez le zéro et le décalage du membre, puisque vous prenez l’adresse de l’expression. Autrement dit, si off est l’offset du membre, vous faites

 0 + off 

ne pas

 *(0 + off) 

de sorte que vous ne faites jamais réellement un access mémoire.