Je me suis confondu avec l'allocation de taille avec mon compilateur GCC, peut-on aider à cela que la taille est allouée pour le code suivant.
struct node { int data; struct node *next; }*link;
3 Réponses :
Si vous voulez la taille de la structure que vous devez faire et pour un type de liste de liste liée, je vous recommanderais quelque chose comme ceci p> Ensuite, vous devrez simplement le déclarer votre principal ou n'importe où vous P> Tailleof (lien) code> retournera toujours 8 octets car c'est la taille d'un pointeur dans un ordinateur 64 bits.
tailleof (noeud de structure) code> car il vous donnera la taille de la structure réelle. p>
pnode list = NULL;
sizeof(Node) //for memory allocation
Horrible habitude cacher des pointeurs de cache dans Typefefs.
Mais toujours, il est en commun comme exemple si vous codez une application Win32 et que vous utilisez un LPSTR, vous utilisez un type TYPEDEF Char * PSTR, * LPSTR car il facilite votre code de code et plus simple
Non, cela rend le code très difficile à lire. C'est une très mauvaise pratique et l'utilisation dans Win32 ne prouve pas qu'il est bon.
Alors, comment feriez-vous une bonne manière?
juste pour ne pas cacher les pointeurs
Tailleof Code> Taille de retour en octets LI>
-
int code> 32 bits = 4 octets li>
- Tout pointeur
Char * code>, struct tout * code> est constitué de la structure de la mémoire, dans votre cas de 8. li>
- En raison de la mémoire Alligment Votre premier exemple a la taille de = 16, plus ici: https: // fr. wikipedia.org/wiki/data_tructure_alignment , vous pouvez ajouter
#pragma pack (1) code> et voir diffrents, doit être de 4 + 8 = 12 li>
ol>
sur votre plate-forme spécifique em>, il ressemble à un donc si Dans votre dernier exemple, vous avez Encore une fois, notez que c'est juste une meilleure estimation pour votre plate-forme em>. Aucun de cela n'est garanti et peut varier d'une plate-forme à l'autre. P> int code> a la taille 4 et un pointeur a la taille 8. Il semble également qu'il souhaite aligner les pointeurs sur un 8- limite d'octet. p>
struct noeud code> contient simplement un
int code>, puis la taille est 4. S'il s'agit d'un pointeur, sa taille est 8. S'il contient à la fois un
int code> et un pointeur, puis il a besoin de 12 octets, mais afin de maintenir l'alignement du pointeur, il couvre la structure à un multiple de 8, entraînant une taille de 16. P>
lien code> défini comme un pointeur sur un noeud de structure code> code>. Dans ce cas, peu importe le nœud
struct code> contient. Étant donné que
link code> est juste un pointeur, sa taille sera toujours 8. P>
Merci d'avoir une photo claire de votre réponse, mais j'ai frappé à la place, où vous avez dit que cela me dissipe la structure à plusieurs heures de 8. Pouvez-vous m'expliquer en bref s'il vous plaît.
Les tailles de structure @selvabharathis sont rembourrées à un multiple de l'alignement le plus restrictif de l'un des éléments de ceux-ci. Par exemple, si une structure contient un élément qui souhaite être aligné sur une limite de 8 octets, la taille sera remplacée sur un multiple de 8.
@selvabharathis Une raison pour cela est de pouvoir placer plusieurs copies de la structure dans un tableau et que tous soient correctement alignés. Les éléments d'un tableau sont placés directement adjacents les uns aux autres, de sorte que si le premier élément de matrice est aligné sur une limite de 8 octets, sa taille doit être un multiple de 8 pour maintenir l'alignement de 8 octets pour l'élément de matrice suivant.
wow, je l'ai eu, merci@ Tom-Karzes
@selvabharathis Notez également que si votre structure contient un int code> suivi d'un pointeur, il devra placer 4 octets de rembourrage entre i> les deux membres de la structure afin d'aligner le pointeur . De cette façon, si la structure est placée sur une limite de 8 octets, le pointeur sera correctement aligné. Vous devez donc prendre en compte la séquence.
@selvabharathis, par exemple, si une structure contient un int code>, alors un pointeur, puis un autre
int code>, vous pourriez penser qu'il doit être 16 octets long, mais il serait en fait besoin d'être 24 octets: 4 pour le premier
int code>, puis 4 octets de rembourrage, puis 8 pour le pointeur, puis 4 pour le second
int code>, et enfin 4 autres octets de remplissage rembourrer la taille de la structure dans son ensemble. Vous avez donc 4 + 4 + 8 + 4 + 4 + 4 = 24 octets. Si au lieu de cela, le pointeur était au début ou à la fin, et que l'INT était adjacent, la taille ne serait que 16. Le commandement l'affecte.
@selvabharathis La réponse qui a été répertorie car le duplicata passe plus en détail à ce sujet.
LIRE À propos du rembourrage de la structure et de l'alignement, Tailleof (lien) est 8 parce que vous vérifiez la taille de pointeur, pas la structure elle-même. Tailleof (* link) vous donnera un résultat correct.