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