Alignement des membres internes de la structure en langage C

La description:

****** Différents compilateurs et processeurs ont des alignements différents pour les membres internes de la structure.

****** Utilisez l'opérateur sizeof () pour calculer la longueur de la structure.

### Le décalage de chaque membre de la structure par rapport à la première adresse de la structure est un multiple entier de la taille du membre. Si nécessaire, le compilateur ajoutera un remplissage entre les membres.

### La taille totale de la structure est un multiple entier de la taille du membre de type de base le plus large de la structure . Si nécessaire, le compilateur ajoutera un remplisseur après le dernier membre.

struct A
{
   
   
<span style="white-space:pre">	</span>unsigned short a;<span style="white-space:pre">	</span>//4bytes
	unsigned int b;<span style="white-space:pre">		</span>//4bytes
	unsigned char c;<span style="white-space:pre">	</span>//4bytes
}aa;
Selon l'alignement des membres de la structure, un octet d'espace doit être alloué à c, mais selon l'alignement de la structure, 4 octets sont alloués à c. sizeof (aa) == 12

Les membres de la structure sont alignés et l'espace de stockage doit être alloué en fonction du type de données de base le plus grand de la structure. Par exemple, lorsqu'un membre A alloue plus d'espace que sa propre taille, si le membre B suivant a besoin d'espace, A alloue le reste de l'espace. Lorsque l'espace est suffisant pour le stockage B, alors B ne sera pas alloué, mais si le stockage pour B ne peut pas être satisfait, B sera alloué selon le plus grand type de données de la structure.


### Calculez le décalage d' un membre de la structure par rapport à la première adresse de la structure, qui peut être obtenu via la macro offsetof ().

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
//TYPE:结构体的类型
//MEMBER:结构体中某个成员
/*
 *offsetof(,)宏解析:
 *(TYPE  *)0:将0强制转换成指向结构体首地址的指针(结构体首地址为0地址)
 *((TYPE *)0)->MEMBER:结构体中某个变量
 * &((TYPE *)0)->MEMBER:取成员变量MEMBER(都是在0地址的基础上增加的)的地址
 * (size_t) &((TYPE *)0)->MEMBER:将取到的地址强制转换成size_t数据类型。
 */

Initialisation des variables de structure:

Structure:

struct A
{
	unsigned short b;
	unsigned int a;
	unsigned short c;
	unsigned short f;
	unsigned short g;
	unsigned short d;
	unsigned char e;
} ;

La première méthode d'initialisation:

struct A aa={
	.b=2,
	.a=1,
	.c=3,
	.d=4,
	.e=5,
	.f=6,
	.g=7
	};	

La deuxième méthode d'initialisation:

struct A aa={1,2,3,4,5,6,7};

La troisième méthode d'initialisation:

struct  A aa;
aa.b=2;
aa.a=1;
aa.c=3;
aa.d=4;
aa.e=5;
aa.f=6;
aa.g=7;





Je suppose que tu aimes

Origine blog.csdn.net/wzc18743083828/article/details/26584461
conseillé
Classement