代码之家  ›  专栏  ›  技术社区  ›  Alex B

联合元素对齐

  •  20
  • Alex B  · 技术社区  · 15 年前

    如果我有一个联合体,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 回复  |  直到 15 年前
        1
  •  26
  •   Jonathan Leffler    15 年前

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

    因此,您询问的表达式中的个别比较是正确的,但是表达式作为一个整体是错误的,除非联合位于地址0x001。

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

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

    修订版本比较不同的指针类型-指针应转换为空指针。


    我被要求引用该标准——或者确定该标准的章节。

    C99-第6.7.2.1节结构和联合规范(第14段):

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