联盟元素对齐

Ale*_*x B 20 c alignment unions

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

union U {
    long l;
    int i;
    short s;
    char c[2];
} u;
Run Code Online (Sandbox Code Playgroud)

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

(&u.l == &u.i) && (&u.i == &u.s) && (&u.s == &u.c[0])
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 27

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

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

删除的文本应用于以下比较:

&u.l == &u.i == &u.s == &u.c[0]
Run Code Online (Sandbox Code Playgroud)

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


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

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

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

  • 您能参考标准的相关部分吗? (4认同)