/ / Les noms de structure sont-ils des pointeurs sur le premier élément? - c, pointeurs, struct

Les noms de structure sont-ils des pointeurs sur le premier élément? - c, pointeurs, struct

J'ai trouvé quelques questions similaires mais aucune d'entre elles n'a beaucoup aidé. Les noms de structure pointent-ils vers le premier élément de la structure, similaires à un tableau?

struct example {
int foo;
int bar;
};

struct example e;
e.foo = 5;
e.bar = 10;
printf("%dn%dn%dn%dn%dn%dn", e, e.foo, e.bar, &e, &e.foo, &e.bar);

Sortie:

5
5
10
2033501712
2033501712
2033501716

Toutes les réponses aux autres questions disaient "non", mais cette sortie me confond. Toute aide serait grandement appréciée.

Réponses:

5 pour la réponse № 1

L'adresse d'un struct est bien l’adresse du premier élément, bien que vous ayez besoin de connaître le type de l’élément pour pouvoir le lancer en toute sécurité

(C1x §6.7.2.1.13: "Un pointeur sur un objet de structure, de manière appropriée converti, pointe vers son membre initial ... et inversement. Il peut être un padding non nommé à l'intérieur comme objet de structure, mais pas à son début.")

Bien que ce soit un peu moche, de nombreux morceaux deles logiciels de production en dépendent. QNX, par exemple, utilise ce type de comportement dans la logique OCB (Open Control Block) lors de l'écriture de gestionnaires de ressources. Gtk aussi quelque chose de similaire.

Votre mise en œuvre actuelle est cependant dangereuse. Si vous devez vous fier à ce comportement, faites-le comme ceci et n’essayez pas de passer un pointeur sur une structure en tant qu’argument. printf(), car vous cassez intentionnellement une fonctionnalité d’une langue avec une sécurité de type minimale.

struct example {
int foo;
int bar;
};

struct example myStruct = { 1, 2 };
int* pFoo = (int*)&myStruct;
printf("%d", *pFoo);

Enfin, cela ne vaut que pour le premier élément. Les éléments suivants peuvent ne pas être la situation où vous vous attendez, à savoir en raison de struct emballage et rembourrage.


3 pour la réponse № 2

struct Les noms ne sont pas des pointeurs vers quoi que ce soit. Vous invoquez comportement indéfini en passant un struct à printf avec un spécificateur de format incompatible %d. Cela peut sembler "fonctionner" car le premier membre de la structure a la même adresse que le struct lui-même