一、规则
1. 结构体的第一个成员永远放在结构体起始位置偏移为0的地址
2. 结构体从第二个成员,总是放在一个对齐数的整数倍数
对齐数 = Min(编译器默认的对齐数:变量自身大小)
编译器默认的对齐数和变量自身大小的较小值
VS默认对齐数为8
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
二、示例
示例一
#include<stdio.h>
typedef struct
{
char value1;
int value2;
char value3;
}S1;
int main(void)
{
printf("sizeof(char)=%d\n",sizeof(char));
printf("sizeof(int)=%d\n", sizeof(int));
printf("sizeof(S1)=%d\n", sizeof(S1));
}
示例二
#include<stdio.h>
typedef struct
{
char value1;
char value2;
int value3;
}S1;
int main(void)
{
printf("sizeof(char)=%d\n",sizeof(char));
printf("sizeof(int)=%d\n", sizeof(int));
printf("sizeof(S1)=%d\n", sizeof(S1));
}
示例三
#include<stdio.h>
typedef struct
{
double value1;
char value2;
int value3;
}S1;
int main(void)
{
printf("sizeof(char)=%d\n",sizeof(char));
printf("sizeof(int)=%d\n", sizeof(int));
printf("sizeof(double)=%d\n", sizeof(double));
printf("sizeof(S1)=%d\n", sizeof(S1));
}
示例四
#include<stdio.h>
typedef struct
{
double value1;
char value2;
int value3;
}S1;
typedef struct
{
char value1;
S1 value2;
double value3;
}S2;
int main(void)
{
printf("sizeof(char)=%d\n",sizeof(char));
printf("sizeof(int)=%d\n", sizeof(int));
printf("sizeof(double)=%d\n", sizeof(double));
printf("sizeof(S1)=%d\n", sizeof(S1));
printf("sizeof(S2)=%d\n", sizeof(S2));
}