sizeof union是否始终是其中最大数据类型的大小?

时间:2017-11-21 02:58:34

标签: c

我尝试使用一个简单的代码来查看我创建的联合的大小,它说大小是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。

4 个答案:

答案 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)。