1.结构体的第一个成员要放在结构体变量在内存中存储位置的0偏移处开始
2.第二个往后的所有成员,都放在对齐数 整数倍 的地址处
3.结构体的总大小是结构体所有成员对齐数中最大的那个的整数倍
4.对于结构体嵌套来说,如果嵌套结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(包含嵌套结构体的对齐数)的整数倍。
在图中因为16正好是其最大对齐数(8)的整数倍,故不用再另外占用空间
用代码来表示占用的空间有多大
#include<stdio.h>
struct test
{
char ch;
int i;
double d;
}s1;
int main()
{
int ret = sizeof(s1);
printf("%d", ret);
return 0;
}
当然结果和我们计算的也没差
我们再在此基础上说明一下结构体嵌套的规则
还是这个代码,但是我们在此基础上嵌套一个结构体test2
struct test2
{
int i;
double q;
char m;
};
struct test
{
struct test2 y;
char ch;
int i;
double d;
}s1;
int main()
{
int ret = sizeof(s1);
printf("%d", ret);
return 0;
}
此时在test中的y变量对齐到8(test2结构体里最大的对齐数为8)的整数倍处,y占16个字节
结构体变量s1的大小就是test(最大对齐数为8)与test2(最大对齐数为8)中最大对齐数的整数倍,其原理也与上例类似 大家可自己画图算一算,此例结果为40