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
相关产品推荐
相关产品推荐

