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

J’ai trouvé quelques questions similaires, mais aucune d’entre elles n’a beaucoup aidé. Les noms de structure sont-ils des pointeurs 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("%d\n%d\n%d\n%d\n%d\n%d\n", 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.

L’adresse d’une 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 object de structure, converti de manière appropriée, pointe vers son membre initial … et inversement. Il peut y avoir un remplissage non nommé à l’intérieur de l’object de structure, mais pas à son début.”)

Bien que ce soit un peu moche, de nombreux 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 baser sur ce comportement, procédez comme suit et n’essayez pas de passer un pointeur sur une structure comme argument de printf() , car vous cassez intentionnellement une fonctionnalité d’un langage 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 ne peuvent pas être la situation où vous vous attendez, notamment en raison de struct et padding .

struct noms de struct ne sont des pointeurs vers rien. Vous appelez un comportement indéfini en transmettant une 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 la struct elle struct même.