我想做这样的事情:
union U {
int i;
double d;
};
void foo (double *d) { *d = 3.4; }
int main ()
{
union U u;
foo (&(u.d));
}
Run Code Online (Sandbox Code Playgroud)
gcc不抱怨(和-Wall -Wextra)并且它按预期工作,但我想确保它实际上是合法的(根据标准).
为什么不合法?实际上,它甚至保证每个成员的地址等于整个联盟的地址:
指向适当转换的联合对象的指针指向其每个成员[...],反之亦然.
(C11,§6.7.2.116)
(这意味着你可以指向工会成员)