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

为何sizeof返回8字节?C语言结构体内存对齐问题咨询

为什么包含int和char的结构体sizeof结果是8而非5?

这是内存对齐导致的——C语言编译器会自动给结构体添加填充字节,目的是让CPU能更高效地访问内存。

具体来说:

  • 多数CPU访问内存时是按固定“块大小”(比如32位系统通常是4字节,64位系统可能是8字节)来读取的。如果数据没有对齐到这个块大小,CPU需要分多次读取再拼接数据,效率会大幅降低。
  • 你的结构体里最大的成员是int(占4字节),所以编译器会按照4字节的规则来对齐整个结构体。int num占4字节,char ch占1字节,加起来是5字节,但为了凑够4字节的整数倍,编译器会在ch后面自动填充3个空字节,最终结构体总大小就变成了8字节。

你可以打印成员地址验证这个布局:

struct test t;
printf("num的地址: %p\nch的地址: %p\n结构体整体地址: %p\n", &t.num, &t.ch, &t);

会看到ch的地址比num大4,而结构体结束的位置比ch大4(包含3字节填充)。

如果一定要让结构体大小是5字节,可以用编译器特定的指令取消对齐(不推荐,可能导致性能下降,甚至在某些平台无法运行),比如GCC下可以加__attribute__((packed)):

struct test __attribute__((packed))
{
    int num;
    char ch;
};

这时候sizeof(struct test)就会返回5,但要注意这种写法不具备跨编译器的兼容性。

内容的提问来源于stack exchange,提问作者UnitedKingdom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:00:57