我想做这样的事情:
union U {
int i;
double d;
};
void foo (double *d) { *d = 3.4; }
int main ()
{
union U u;
foo (&(u.d));
}
gcc
没有抱怨(使用-Wall -Wextra
)并且它按预期工作,但我想确保它实际上是合法的(根据标准)。
答案 0 :(得分:6)
为什么不合法?实际上,它甚至保证每个成员的地址等于整个联盟的地址:
指向适当转换的联合对象的指针指向其每个成员[...],反之亦然。
(C11,§6.7.2.116)
(这意味着你可以获取指向工会成员的指针)
答案 1 :(得分:4)
是的,这是合法的,没有理由不这样做。就这么简单。
答案 2 :(得分:3)
C99:
6.5.3.2
地址和间接运营商
约束
- 一元&的操作数运算符应该是函数指示符,结果 一个[]或一元*运算符,或指定一个对象的左值 这不是一个小字段,也不是用寄存器声明的 存储级别指定
醇>
[...]
<强>对象强> 执行环境中的数据存储区域 其内容可以代表值
所以,是的,联合是一个对象,因此可能是&amp;的一个操作数。只要它符合其他要求。