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

C语言编程中union的大小为什么不符合预期?示例输出56而非50

这个结果是C语言的内存对齐(内存地址对齐)规则导致的,union的内存分配规则实际包含两个要求:

  • 内存总大小至少能够容纳内部最大的成员
  • 内存总大小必须是union内部所有基础数据类型成员的对齐模数的整数倍

我们先看你示例中union内部三个成员的常规大小与对齐要求(常见64位/32位编译环境默认对齐配置下):

  • int roll:占4字节,要求地址对齐到4的整数倍
  • double marks:占8字节,要求地址对齐到8的整数倍
  • char name[50]:占50字节,char类型对齐要求为1字节

其中最大的成员是name[50]占50字节,但union整体的对齐要求需要适配内部对齐要求最高的double类型的8字节规则。50并不是8的整数倍,因此编译器会在数组尾部填充6字节的冗余空间,把总大小补到8的最小整数倍56,这就是你得到sizeof(arr)=56的原因。

如果要取消对齐拿到预期的50,可以在声明union时添加强制无对齐的编译修饰,比如GCC/Clang环境下可以写成:

union student __attribute__((packed))
{
    int roll;
    double marks;
    char name[50];
};

此时编译运行得到的sizeof(arr)结果就是50。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:36:03