You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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按固定字节块读取数据,不对齐的话需要多次读取拼接,耗时更多)。当前环境的对齐规则如下:

  1. 每个成员的起始地址必须是自身类型大小的整数倍;
  2. 整个结构体的总大小,必须是结构体中最大基本类型成员大小的整数倍(这里最大基本类型是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:28:19