1.结构体的第一个成员要放在结构体变量在内存中存储位置的0偏移处开始

2.第二个往后的所有成员,都放在对齐数 整数倍 的地址处

3.结构体的总大小是结构体所有成员对齐数中最大的那个的整数倍

4.对于结构体嵌套来说,如果嵌套结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(包含嵌套结构体的对齐数)的整数倍。

alt

在图中因为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;
}

当然结果和我们计算的也没差

alt

我们再在此基础上说明一下结构体嵌套的规则

还是这个代码,但是我们在此基础上嵌套一个结构体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

alt