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段):
指向联合对象的指针(适当转换)指向其每个成员(或者如果成员是位域,则指向它所在的单位),反之亦然.