【问题标题】:Union element alignment联合元素对齐
【发布时间】:2010-10-27 20:21:50
【问题描述】:

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

【问题讨论】:

  • 提醒您记住标准没有说的 u.i&0xFF == u.c[0] 或 i 的低位字节不保证是 c[0](字节序)

标签: c alignment unions


【解决方案1】:

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

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

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

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

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


我被要求引用标准 - 或指明标准的部分。

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

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

【讨论】:

  • 能否参考标准的相关部分?
猜你喜欢
  • 2012-09-07
  • 2012-07-20
  • 2014-01-22
  • 2011-07-17
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多