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

Linux x86-64环境下C语言结构体为何无需填充仍被编译器填充?

Linux x86-64下C语言结构体填充的问题解析

先明确x86-64 Linux环境下的基本规则:

  • int 占4字节,对齐要求4字节
  • char 占1字节,对齐要求1字节
  • 指针(如char*)占8字节,对齐要求8字节
  • 结构体的整体对齐要求等于其最大成员的对齐值,且总大小必须是该对齐值的整数倍

struct a的内存布局分析

struct a {
    int ak;    // 4字节,地址范围0-3
    char ac;   // 1字节,地址4
               // 填充3字节(地址5-7):因为后续指针需要8字节对齐,必须从8的倍数地址开始
    char* aptr;// 8字节,地址8-15
};

总大小:4+1+3+8=16,刚好是8的倍数,满足结构体对齐要求。

struct b的内存布局分析

struct b {
    char* bptr;// 8字节,地址范围0-7
    int bk;    // 4字节,地址8-11
    char bc;   // 1字节,地址12
               // 填充3字节(地址13-15):结构体整体要满足8字节对齐,当前成员总字节数13不是8的倍数,必须补到16
};

成员排列确实没有跨字块,但结构体末尾的填充是为了保证结构体数组的对齐正确性:如果struct b大小是13,数组中第二个元素的起始地址就是13,而指针成员需要8字节对齐,13不是8的倍数,会导致对齐错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:25:20