如果我有一个联合,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])
每个元素的开头与联合本身的地址对齐。
因此,您询问的表达式中的单个比较是正确的,但整个表达式是错误的,除非联合位于地址 0x0001。
删除的文本适用于以下比较:
&u.l == &u.i == &u.s == &u.c[0]
修改后的版本比较了不同的指针类型——指针应该被转换为 void 指针。
我被要求引用标准 - 或确定标准的部分。
C99 - 第 6.7.2.1 节结构和联合说明符(第 14 段):
一个指向联合对象的指针,经过适当的转换,指向它的每个成员(或者如果一个成员是一个位域,那么指向它所在的单元),反之亦然。