Alineación de miembros internos de estructura en lenguaje C

Descripción:

****** Los diferentes compiladores y procesadores tienen diferentes alineaciones para los miembros internos de la estructura.

****** Utilice el operador sizeof () para calcular la longitud de la estructura.

### El desplazamiento de cada miembro en la estructura en relación con la primera dirección de la estructura es un múltiplo entero del tamaño del miembro. Si es necesario, el compilador agregará relleno entre los miembros.

### El tamaño total de la estructura es un múltiplo entero del tamaño del miembro de tipo básico más ancho de la estructura . Si es necesario, el compilador agregará un relleno después del último miembro.

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;
Según la alineación de los miembros de la estructura, debería asignarse un byte de espacio a c, pero según la alineación de la estructura, se asignan 4 bytes a c. tamaño de (aa) == 12

Los miembros de la estructura están alineados y el espacio de almacenamiento debe asignarse de acuerdo con el tipo de datos básicos más grande de la estructura. Por ejemplo, cuando un miembro A asigna más espacio que su propio tamaño, si el siguiente miembro B necesita espacio, A asigna el resto del espacio Cuando el espacio es suficiente para el almacenamiento B, entonces B no se asignará, pero si el almacenamiento para B no se puede satisfacer, B se asignará de acuerdo con el tipo de datos más grande de la estructura.


### Calcula el desplazamiento de un miembro de la estructura en relación con la primera dirección de la estructura, que se puede obtener mediante 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数据类型。
 */

Inicialización de variables de estructura:

Estructura:

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

El primer método de inicialización:

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

El segundo método de inicialización:

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

El tercer método de inicialización:

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





Supongo que te gusta

Origin blog.csdn.net/wzc18743083828/article/details/26584461
Recomendado
Clasificación