Unión de enumeración de estructuras, cálculo de tamaño

Sugerencia: Una vez escrito el artículo, la tabla de contenido se puede generar automáticamente. Para saber cómo generarlo, consulte el documento de ayuda a la derecha.


1. Estructura

La declaración de una estructura; una estructura es una colección de valores, que se denominan variables miembro. Cada miembro de la estructura puede ser un tipo diferente de variable.

struct Stu
{
    
    
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
}//分号不能丢

Autorreferencia de estructura

typedef struct Node
{
    
    
 int data;
 struct Node* next;
}Node

Calcular el tamaño de la estructura

(La alineación es una forma eficaz de usar el espacio por tiempo en una
estructura ) En primer lugar, debe dominar las reglas de alineación de la estructura:

  1. El primer miembro está en una dirección con un desplazamiento de 0 de la variable de estructura.
  2. Otras variables miembro deben alinearse con una dirección que sea un múltiplo entero de un cierto número (número de alineación).
  3. El tamaño total de la estructura es un múltiplo entero de la alineación máxima (cada variable miembro tiene una alineación).
  4. Si la estructura está anidada, la estructura anidada se alinea con un múltiplo entero de su alineación máxima y el tamaño total de la estructura es un múltiplo entero de todas las alineaciones máximas (incluida la alineación de las estructuras anidadas).
  5. Número de alineación = el valor más pequeño del número de alineación predeterminado del compilador y el tamaño del miembro
  6. El valor predeterminado en VS es 8
struct S2
{
    
    
	char c1; //1
	char c2; //1 + 2
	int i;   //4
};

//16
struct S3
{
    
    
	double d; //8
	char c;   //1 + 3
	int i;    //4
};

struct S4
{
    
    
	char c1;       //1 + 7
	struct S3 s3;  //16
	double d;      //8
};

struct S1
{
    
    
char c1; //1 + 3
int i;   //4
char c2; //1 + 3
};

También hay patrones anidados

typedef struct Test
{
    
    
	short a;      //2 + 6
	struct
	{
    
    
		int b;    //4 + 4
		double c; //8
		char d;   //1 + 7
	};
	int e;        //4 + 4
}Test;//40

typedef struct Test
{
    
    
	short a;      //2 + 6
	struct
	{
    
    
		int b;        //4 + 4
		double c[10]; //80
		char d;       //1 + 7
	};
	int e;        //4 + 4
}Test;//112

#pragma pack(2)//可以自指定大小,但不一定是有效值
typedef struct Test
{
    
    
	short a;      //2
	struct
	{
    
    
		int b;        //4
		double c;     //8
		char d;       //1 + 1
	};
	int e;        //4
}Test;//20


Segmento de bits

¿Qué es un
segmento de bits? La declaración y estructura de un segmento de bits son similares, con dos diferencias:
1. Los miembros de un segmento de bits deben ser int, unsigned int o con signo int.
2. Hay dos puntos y un número después del nombre de miembro del segmento de bits.

typedef struct Test
{
    
    
	char a : 1; // 0 1  开关值  位域
	char b : 6; // 0 1
	char c : 3; // 0 1=
}Test;//( and b) c  2

typedef struct Test
{
    
    
	char a : 1;
	int  b : 1;
}Test;//8 不同的不能通用,就还是要补齐

Los datos almacenados del segmento de bits solo se almacenarán en el espacio creado por él mismo, incluso si el número de dígitos no se almacena, se truncará inmediatamente.
Asignación de memoria

  1. Los miembros del segmento de bits pueden ser int unsigned int con signo int o char (pertenecientes a la familia de enteros)
  2. El espacio del segmento de bits se abre en 4 bytes (int) o 1 byte (char) según sea necesario.
  3. Los segmentos de bits implican muchos factores inciertos. Los segmentos de bits no son multiplataforma. Los programas que se centran en la portabilidad deben evitar el uso de segmentos de bits.
    Problemas multiplataforma
  4. No se sabe si el campo de bits int se trata como un número con signo o sin signo.
  5. No se puede determinar el número de bits más grandes en el segmento de bits. (La máquina de 16 bits tiene hasta 16 y la máquina de 32 bits tiene hasta 32, escrito como 27, lo que provocará problemas en las máquinas de 16 bits.
  6. Los miembros del segmento de bits se asignan de izquierda a derecha en la memoria o no se han definido los criterios para la asignación de derecha a izquierda.
  7. Cuando una estructura contiene dos segmentos de bits, y el segundo miembro de segmento de bits es relativamente grande y no puede acomodar los bits restantes del primer segmento de bits, es incierto si descartar los bits restantes o usarlos.

Dos, enumeración

La enumeración, como su nombre lo indica, enumera uno por uno.
Enumere los valores posibles uno por uno.

typedef enum TYPE
{
    
    
	ADD,//0
	SUM,//1
	MUL,
	DIV,
	MOD,
	SQU
}TYPE;
void main()
{
    
    
	printf("%d %d %d %d\n", ADD, SUM, MUL, DIV);//0 1 2 3
	printf("size = %d\n", sizeof(enum TYPE));//4
}

Cuando se da un número, este último agregará uno al número anterior.

Tres, conjunto

Unión es también un tipo personalizado especial. Las variables definidas por este tipo también contienen una serie de miembros. La característica es que estos miembros comparten el mismo espacio (por lo que unión también se llama unión).

Características conjuntas

Los miembros de la unión comparten el mismo espacio de memoria El tamaño de dicha variable de unión es al menos el tamaño del miembro más grande (porque la unión debe al menos poder almacenar el miembro más grande).

Cálculo del tamaño de la junta

El tamaño de la unión es al menos el tamaño del miembro más grande.
Cuando el tamaño máximo del miembro no es un múltiplo integral de la alineación máxima, debe alinearse con un múltiplo integral de la alineación máxima.

union Test
{
    
    
	int a;
	double b;
	char c;
};

void main()
{
    
    
	printf("size = %d\n", sizeof(union Test));//8
	union Test t;
	t.b = 12.34;
	printf("%f\n", t.b);//12.340000
	t.a = 100;
	printf("%d\n", t.a);
	t.c = 'A';

	printf("%f\n", t.b);//12.3339996
	printf("%d\n", t.a);//65
}

Debido a que el tamaño de la memoria es compartida, los datos de la anterior cambiarán después de la siguiente asignación.

Supongo que te gusta

Origin blog.csdn.net/weixin_45070922/article/details/110189468
Recomendado
Clasificación