关于C语言结构体sizeof输出的疑问:为何大小为40而非38?
结构体内存大小计算与对齐问题解析
各printf输出值的计算逻辑
sizeof(bob.c):bob.c是长度为30的char数组,每个char占1字节,30×1=30,所以输出30。sizeof(bob.a):a是int类型,当前编译环境下int占4字节,输出4。sizeof(bob.b):b同样是int类型,占4字节,输出4。sizeof(struct test)和sizeof(bob):两者完全等价,都是整个结构体的内存大小,实际输出40,核心原因是编译器的内存对齐规则。
结构体大小为40的原因:内存对齐机制
C语言编译器会自动给结构体做内存对齐,本质是为了让CPU更高效地读取内存(CPU按固定字节块读取数据,不对齐的话需要多次读取拼接,耗时更多)。当前环境的对齐规则如下:
- 每个成员的起始地址必须是自身类型大小的整数倍;
- 整个结构体的总大小,必须是结构体中最大基本类型成员大小的整数倍(这里最大基本类型是
int,占4字节)。
拆解你的结构体内存布局:
- 成员
a(4字节):从地址0开始,占用0-3字节; - 成员
b(4字节):起始地址需是4的倍数,紧跟a的位置,占用4-7字节; - 成员
c(30字节):起始地址8(符合char的对齐要求,1的倍数),占用8-37字节。
此时已用内存是4+4+30=38字节,但根据第二条规则,总大小必须是4的整数倍,38离最近的4的倍数差2字节,所以编译器会在c的后面自动填充2个字节的空白空间,最终结构体总大小为40字节。
内容的提问来源于stack exchange,提问作者Ozy Razor
相关产品推荐
相关产品推荐

