在C中取一个工会成员的地址是合法的吗?

Nic*_*lle 2 c unions

我想做这样的事情:

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)并且它按预期工作,但我想确保它实际上是合法的(根据标准).

Mat*_*lia 6

为什么不合法?实际上,它甚至保证每个成员的地址等于整个联盟的地址:

指向适当转换的联合对象的指针指向其每个成员[...],反之亦然.

(C11,§6.7.2.116)

(这意味着你可以指向工会成员)