有些书说是,但以下代码显示它不是真的
union
{
int n;
char array[5];
} u;
printf("%d %d %d", sizeof(u.n), sizeof(u.array), sizeof(u));
你有什么看法?
答案 0 :(得分:2)
答案 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>