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

C语言中成员数量相同的两个结构体sizeof结果不同的原因是什么?

为什么两个结构体大小不同?

嗨,这个问题其实是C语言里很常见的内存对齐搞的鬼!咱们来一步步拆解为什么两个结构体的sizeof结果不一样。先把你的代码整理得更清晰些:

typedef struct a { 
    int x; 
    char a; 
    int y; 
    char b; 
    int z; 
    char c; 
} s1; 

typedef struct b { 
    int x; 
    int y; 
    int z; 
    char a; 
    char b; 
    char c; 
} s2; 

int main() { 
    printf("%d %d\r\n", sizeof(s1), sizeof(s2)); 
    return 0; 
}

接下来咱们分析内存布局——这里假设你的编译器默认按4字节对齐(这是32/64位系统中int类型的常见对齐规则):

结构体s1的内存占用

s1的成员是int → char → int → char → int → char的交替排列,每个int占4字节,char占1字节,但对齐规则要求每个成员的起始地址必须是自身大小的整数倍:

  • int x:占用0-3字节(共4字节)
  • char a:占用4字节,但下一个成员是int,必须从8字节开始(4的倍数),所以在4-7字节间填充3个空字节
  • int y:占用8-11字节(共4字节)
  • char b:占用12字节,同样需要填充3个空字节到15字节,才能让下一个int z从16字节开始
  • int z:占用16-19字节(共4字节)
  • char c:占用20字节,最后结构体整体大小必须是最大成员大小(4字节)的整数倍,所以再填充3个空字节到23字节

最终s1的总大小是24字节。

结构体s2的内存占用

s2把所有int成员放在一起,再集中放char成员,布局紧凑很多:

  • int x:0-3字节,int y:4-7字节,int z:8-11字节(三个int总共12字节)
  • char a:12字节,char b:13字节,char c:14字节(三个char共3字节)
  • 最后结构体整体需要对齐到4字节的倍数,所以填充1个空字节到15字节

最终s2的总大小是16字节。

额外补充

内存对齐是编译器的默认优化,目的是让CPU更高效地读取内存(CPU通常按固定大小的块读取内存,不对齐的话需要两次读取拼接,会拖慢速度)。如果确实需要让两个结构体大小一致(比如序列化数据的场景),可以用编译器指令修改对齐规则:

#pragma pack(1) // 强制按1字节对齐,关闭自动填充
typedef struct a { ... } s1;
typedef struct b { ... } s2;
#pragma pack() // 恢复默认对齐规则

但这种做法会牺牲CPU的访问性能,除非有特殊需求,否则不建议这么做。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:10:54