24

如果我有一个联合,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])
4

1 回答 1

33

每个元素的开头与联合本身的地址对齐。

因此,您询问的表达式中的单个比较是正确的,但整个表达式是错误的,除非联合位于地址 0x0001。

删除的文本适用于以下比较

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

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


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

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

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

于 2009-05-21T05:16:10.470 回答