Taille d’un pointeur pointant vers une structure

J’essayais de me rappeler les bases de la programmation en C, et en ce qui concerne les pointeurs vers les structures, je faisais ce qui suit:

#include  #include  #include  int main() { struct MyStruct { int number; char *name; }; int i; struct MyStruct *p_struct = (struct MyStruct *) malloc (sizeof(struct MyStruct)*3); printf("sizeof(struct MyStruct) = %d\n", sizeof(struct MyStruct)); for (i=0; i<3;i++) { (*p_struct).number = i; (*p_struct).name = "string"; printf("(*p_struct).number = %d, (*p_struct).name = %s\n", (*p_struct).number (*p_struct).name); ++p_struct; } printf("sizeof(p_struct) = %d\n", sizeof(p_struct)); free (p_struct); return 1; } 

Ma question est la suivante: la taille de la structure est de 8 octets, ce qui est correct comme 4 + 4 = 8 octets en raison de l’alignement / du remplissage du compilateur, mais pourquoi ai-je 4 octets de sizeof(p_struct) ?

Je m’attendais à obtenir 24 (8 octets x 3), pourquoi est-ce le cas?

Si cela est correct, puis-je obtenir la taille totale allouée de 24 octets?

Merci.

Non, la taille de la structure est de huit octets, car vous y trouverez deux champs de quatre octets. Essayez d’imprimer sizeof(int) et sizeof(char *) et voyez par vous-même.

Lorsque vous faites la taille d’un pointeur, vous obtenez toujours la taille du pointeur et jamais ce à quoi il pointe. Il n’ya aucun moyen (en standard C) d’obtenir la taille de mémoire allouée avec malloc .

Notez également que vous avez un comportement indéfini dans votre code lorsque vous modifiez le pointeur p_struct afin qu’il ne pointe plus sur ce que votre appel malloc renvoyé. Cela conduit au comportement indéfini lorsque vous essayez de free cette mémoire.

Les pointeurs ont toujours la même taille sur un système, peu importe leur destination (int, char, struct, etc.); dans votre cas, la taille du pointeur est de 4 octets.

p_struct est un pointeur sur une structure. Les pointeurs prennent généralement 4 ou 8 octets. Si vous vouliez connaître la taille de la structure elle-même, vous utiliseriez sizeof (* p_struct).

Notez que votre code est susceptible de planter, car vous avez augmenté p_struct trois fois, puis appelez free () sur le résultat et non sur le pointeur d’origine renvoyé par malloc. Beaucoup plus clair et sûr d’écrire par exemple

 for (i=0; i<3;i++) { p_struct [i]->number = i; p_struct [i]->name = "ssortingng"; printf("(*p_struct).number = %d, (*p_struct).name = %s\n", p_struct [i]->number p_struct [i]->name) }