第一次写博客,而且是一个小萌新,有什么错误的地方请各位大佬及时提出来,我会立即更改,最后希望这篇文章能对你有帮助
大家对用struct关键字创建一个结构体应该不陌生,但是我们创建的结构体的空间大小怎么计算呢?
这里三个要点:
1.结构体成员代码由上往下执行。
2.结构体成员的地址偏移量(偏移量指的是相对于结构体起始位置的偏移量)应该是该成员所占空间的整数倍(否者就接着往后填充,直到是整数倍)。
3.最终结构体的空间大小是该结构体内所有成员的大小的整数倍(填充最小以满足要求)。
我们用两段代码来做比较
代码1:
#include<stdio.h>
struct S
{
char a;
double b;
int c;
short d;
};
int main()
{
struct S s;
printf("%d\n",sizeof(s));
return 0;
}
代码2:
#include<stdio.h>
struct S
{
int c;
char a;
short d;
double b;
};
int main()
{
struct S s;
printf("%d\n",sizeof(s));
return 0;
}
两段代码仅仅是结构体成员位置不同,最终运行的结果也有可能不相同。
代码1的运行结果
代码2的运行结果
我们来详细了解一下要点2:
我们还是看代码1的结构体各成员地址
成员a的地址是 0x0113FA0C 偏移量是0(偏移量指的是相对于结构体起始位置的偏移量),成员b为double型,占8个字节,向后填充,满足偏移量是8, 然后 0x0x0113FA14 偏移量是8的倍数,所以成员b的地址为0x0x0113FA14。后面的以此类推。
直到结构体最后一个成员的地址,所以 1 + 7 + 8 + 4 + 2 = 22(蓝色的为填充部分)可是运行结果明明是24啊,不着急,我们来看要点3。
要点3详解:
我们的结构体最终大小是该结构体内的所有成员的大小的整数倍,我们再看上图,算出占22个字节空间,可是22不是8的倍数,向后填充,满足最小填充为24,所以结果为24。