-1
votes

Quelqu'un peut-il m'expliquer comment la taille est allouée dans le cas suivant?

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;


1 commentaires

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.


3 Réponses :


0
votes

Tailleof (lien) code> retournera toujours 8 octets car c'est la taille d'un pointeur dans un ordinateur 64 bits.

Si vous voulez la taille de la structure que vous devez faire tailleof (noeud de structure) code> car il vous donnera la taille de la structure réelle. p>

et pour un type de liste de liste liée, je vous recommanderais quelque chose comme ceci p> xxx PRE>

Ensuite, vous devrez simplement le déclarer votre principal ou n'importe où vous P>

pnode list = NULL;

sizeof(Node) //for memory allocation


5 commentaires

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



0
votes
  1. Tailleof Taille de retour en octets
  2. int 32 bits = 4 octets
  3. Tout pointeur Char * , struct tout * est constitué de la structure de la mémoire, dans votre cas de 8.
  4. 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) et voir diffrents, doit être de 4 + 8 = 12

0 commentaires

1
votes

sur votre plate-forme spécifique , il ressemble à un int 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.

donc si struct noeud contient simplement un int , puis la taille est 4. S'il s'agit d'un pointeur, sa taille est 8. S'il contient à la fois un int 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.

Dans votre dernier exemple, vous avez lien défini comme un pointeur sur un noeud de structure . Dans ce cas, peu importe le nœud struct contient. Étant donné que link est juste un pointeur, sa taille sera toujours 8.

Encore une fois, notez que c'est juste une meilleure estimation pour votre plate-forme . Aucun de cela n'est garanti et peut varier d'une plate-forme à l'autre.


7 commentaires

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 suivi d'un pointeur, il devra placer 4 octets de rembourrage entre 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 , alors un pointeur, puis un autre int , 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 , puis 4 octets de rembourrage, puis 8 pour le pointeur, puis 4 pour le second int , 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.