联合的大小是否等于其最大大小的成员的大小?

时间:2013-09-12 07:38:15

标签: c unions

有些书说是,但以下代码显示它不是真的

union
{
     int n;
     char array[5];
} u;
printf("%d %d %d", sizeof(u.n), sizeof(u.array), sizeof(u));

你有什么看法?

5 个答案:

答案 0 :(得分:2)

Cx0 standard它说:

  

联合的大小足以包含其中最大的成员

因此,您不能依赖于大小等于最大成员的大小。它是否依赖于编译器实现,使用的标志等等。

答案 1 :(得分:2)

在这种情况下,联合对齐到32位机器上的4个字节(或64位机器上的8个字节),因此它将在内存中看起来像这样:

11 11 11 11
11 XX XX XX
   ^   ^  ^
   3 padded bytes

因此,为了对齐,添加了额外的三个字节,即大小为8的字节。如果要更改此行为,则需要将其打包为1个字节:

#pragma pack(1)
union
{
     int n;
     char array[5];
} u;
#pragma pack()

现在联合的大小正好是5,看起来像是:

11 11 11 11
11

答案 2 :(得分:2)

联合的大小必须满足两个要求:

  • 必须至少与其最大成员一样大
  • 它必须是每个成员的对齐要求的倍数。

需要后一条规则才能使数组工作;当一个接一个地放在记忆中时,它可以使工会保持正确对齐。

因此,如果最大元素是五个字节但某些元素需要四字节对齐,则联合大小必须是大于或等于五个字节的四个字节的倍数。八个字节满足了这一点。

大多数C实现使用遵循这两个规则的最小大小。

答案 3 :(得分:1)

编译器通常根据对齐要求确定大小。在你的情况下,最大成员的大小是5并且对齐它使它成为8.这是必需的,因为你可以声明这个联合类型的数组。

答案 4 :(得分:1)

标准只保证union的大小足以容纳最大的成员,即不一定大小相同。

  

C11 6.7.2.1结构和联合说明符

     

union的大小足以包含其中最大的成员。 at的值   大多数成员可以随时存储在union对象中。指向适当转换的union对象的指针指向其每个成员(或者如果成员是位域,   然后到它所在的单位),反之亦然。


当我在我的机器上运行您的示例时,输出为4 5 8,可能union的大小填充为机器字的倍数,就像struct一样。< / p>