Comment les membres de la structure sont-ils alloués en mémoire?

En essayant de créer un gestionnaire de mémoire pour les futurs programmes C, j’ai rencontré cette question:

“lorsque les structures sont allouées, leurs champs membres sont-ils stockés dans l’ordre spécifié?”

Par exemple, considérons la structure suivante.

typedef struct { int field1; int field2; char field3; } SomeType; 

Une fois allouées, les adresses de mémoire des champs seront-elles dans l’ordre champs1, champ2, champ3? Ou n’est-ce pas garanti?

Réponse courte : ils sont atsortingbués avec l’ordre comme ils l’ont déclaré dans la structure.


Exemple :

 #include  #include  struct student { int id1; int id2; char a; char b; float percentage; }; int main() { int i; struct student record1 = {1, 2, 'A', 'B', 90.5}; printf("size of structure in bytes : %d\n", sizeof(record1)); printf("\nAddress of id1 = %u", &record1.id1 ); printf("\nAddress of id2 = %u", &record1.id2 ); printf("\nAddress of a = %u", &record1.a ); printf("\nAddress of b = %u", &record1.b ); printf("\nAddress of percentage = %u",&record1.percentage); return 0; } 

Sortie :

 size of structure in bytes : 16 Address of id1 = 675376768 Address of id2 = 675376772 Address of a = 675376776 Address of b = 675376777 Address of percentage = 675376780 

La représentation illustrée de l’allocation de mémoire ci-dessus à structure est donnée ci-dessous. Ce diagramme vous aidera à comprendre très facilement le concept d’allocation de mémoire en C.

entrez la description de l'image ici


Pour en savoir plus : consultez ici (également la source de l’exemple ci-dessus) l’ Structure dynamic memory allocation in C C – Structure Padding et Structure dynamic memory allocation in C

Vous avez la garantie que field3 vient après field2 , qui vient après field1 , et que field1 est au début de la mémoire (c’est-à-dire qu’il n’y a pas de remplissage avant field1 ). Cependant, ils peuvent s’append entre les autres membres (et même après field3 ). En bref, l’ordre dans lequel elles sont déclarées est l’ordre dans lequel elles sont placées en mémoire, même si l’alignement et le remplissage exacts sont définis par l’implémentation (mais il n’y aura pas de remplissage avant le premier membre).

  1. Les membres sont localisés un à un;
  2. Le lieu de départ de chaque membre doit être divisé exactement par sa longueur:

Par exemple:

 typedef struct { char field1; int field2; double field3; } SomeType; 

Le premier emplacement de la structure est x:

La longueur de field1 est de 1 (octet), de file2 à 4, de field3 à 8.

donc field1 est à x + 0, field2 est à x + 4 ~ x + 7, field3 est à x + 8 ~ x + 15, et x + 1 ~ x + 3 est complété pour que field2 soit au bon endroit.

Et toute la longueur de la structure doit être divisée exactement par son plus grand membre; sinon, remplir quelques octets jusqu’à la fin.