提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、sizeof(结构体)
结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单的把所有成员大小相加,而是遵循一定的规则,需要考虑到系统在存储结构体变量时的地址对齐问题。
二、普通结构体
1.规则
(1)结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
(2)结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。
2.举例
代码如下(示例1):
struct stru1
{
int a; //start address is 0
char b; //start address is 4
int c; //start address is 8
};
用sizeof求该结构体的大小,发现值为12。int占4个字节,char占1个字节,按理说是9个字节才对。这个例子中前两个成员的偏移量都满足要求,但第三个成员的偏移量为5,并不是自身(int)大小的整数倍。编译器在处理时会在第二个成员后面补上3个空字节,使得第三个成员的偏移量变成8。结构体大小等于最后一个成员的偏移量加上其大小,上面的例子中计算出来的大小为12。
代码如下(示2):
struct stru2
{
char i; //start address is 0
char n; //start address is 1
int m; //start address is 4
};
同理,大小为8。
三、嵌套结构体
1.在原始规则上附加规则
(1)展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍。
(2)结构体大小必须是所有成员大小的整数倍,这里所有成员计算的是展开后的成员,而不是将嵌套的结构体当做一个整体。
2.举例
代码如下(示例3):
struct stru3
{
short i;
struct
{
char c;
int j;
} tt;
int k;
};
结构体stru3的成员tt.c的偏移量应该是结构体内最大成员(int)的整数倍,所以成员i后面会补上2个空字节,同理c后面也补上2。整个结构体大小应该是16
代码如下(示例4):
struct student
{
char gender;
short num[4];
char name;
};
其值为12。gender占1个字节,到num时偏移量为1,扩展为short的整数倍,而非数组的整数倍,这样偏移量变为2。name为1个字节,偏移量满足要求,则占用空间为11,不满足公因数的要求,所以结果为12。