目录
一:代码
#include<stdio.h>
struct S1 {
char c1;
char c2;
int a;
};
struct S2 {
char c1;
int a;
char c2;
};
struct S3 {
char c1;
struct S1 s1;
int a;
};
int main() {
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
printf("%d\n", sizeof(struct S3));
return 0;
}
结果是 8 和12和16 这是为什么呢?因为这里存在着内存对齐,就是结构体内存对齐
二:结构体内存对齐规则
●结构体的第一个成员变量永远放在结构体起始位置偏移量为零的位置
●从第二个成员变量开始,总是放在偏移量为一个对齐数整数的倍数处
对齐数:编译器默认对齐数与变量自身大小的较小值(取两者之间的较小的那个)Linux没有默认对齐数,VS的默认对齐数是8
●结构体的总大小为各个成员中对齐数最大的那个对齐数的整数倍(就是最大对齐数的整数倍)
●如果嵌套了结构体,嵌套的结构体对齐到自己最大的对齐数的整数倍处,结构体的总大小就是最大对齐数的整数倍(包含嵌套结构体的对齐数)
三:图解