我尝试使用一个简单的代码来查看我创建的联合的大小,它说大小是52而不是50.我尝试使用相同大小的另一个字符串,它会像正常情况一样给出50。额外的2个字节来自哪里?
这里是代码
union Name
{
int y;
float x;
char name[50];
}name;
int main(int argv, char *argc[])
{
char name2[50];
printf("%d",sizeof(name));
printf("\n%d",sizeof(name2));
return 0;
}
结果是52和50。
答案 0 :(得分:3)
根据ISO 9899:201x(C11)草案,(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)
S6.7.2.1 :
第16段:工会的规模足以容纳其中最大的成员。 [...]
第17段:结构或联合的末尾可能有未命名的填充。
[编辑:根据@ M.M的评论使用最近的草稿]
答案 1 :(得分:2)
对齐。如果您尝试创建这些联合的数组,并且它们的x
只有50,则y
和:hover { cursor: pointer; }
成员将无法有效对齐。将大小填充为4的倍数以满足对齐约束。
答案 2 :(得分:1)
解释可以概括为 -
联合类型对象的大小是必需的存储量 表示该类型的最大组件,加上任何填充 最后可能需要将长度增加到对齐 边界强>
答案 3 :(得分:1)
它必然是52. 额外的2个字节不存储数据。这是填充空间。
如果您将float y
更改为double y
,您甚至会看到56:)
某些数据类型无论出于何种原因都需要对齐。在您的情况下,float y
需要与4个字节对齐。如果联合的size只有50,并且您创建了name n[2]
,那么n[1].y
就没有很好地对齐。因此,对于对齐问题,联合的大小填充高达52(4 * 13)。