联盟元素对齐

时间:2009-05-21 05:14:07

标签: c alignment unions

如果我有一个联合,C标准保证联合本身将与最大元素的大小对齐。

union U {
    long l;
    int i;
    short s;
    char c[2];
} u;

但它对联盟内各个联盟元素的对齐有什么看法呢?以下表达式是否保证为真?

(&u.l == &u.i) && (&u.i == &u.s) && (&u.s == &u.c[0])

1 个答案:

答案 0 :(得分:26)

每个元素的开头都与union本身的地址对齐。

所以你问的表达式中的个别比较是正确的,但除非联合位于地址0x0001,否则整个表达式都是假的。

删除的文字应用于以下比较

&u.l == &u.i == &u.s == &u.c[0]

修订后的版本比较了不同的指针类型 - 指针应该转换为void指针。


我被要求引用标准 - 或者确定标准的部分。

C99 - 第6.7.2.1节结构和联合说明符(第14段):

  

指向适当转换的联合对象的指针指向其每个成员(或者如果成员是位域,则指向它所在的单位),反之亦然。