2

I want to do something like this:

union U {
    int i;
    double d;
};

void foo (double *d) { *d = 3.4; }

int main ()
{
     union U u;
     foo (&(u.d));
}

gcc does not complain (with -Wall -Wextra) and it works as expected, but I would like to make sure it is actually legal (according to the standard).

4

3 回答 3

6

为什么不应该是合法的?实际上,甚至可以保证每个成员的地址都等于整个联合的地址:

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

(C11,§6.7.2.1 16)

(这意味着您可以使用指向联合成员的指针)

于 2013-03-16T01:37:43.233 回答
4

是的,这是合法的,没有理由不这样做。就那么简单。

于 2013-03-16T01:35:45.483 回答
2

C99:

6.5.3.2

地址和间接运算符

约束

  1. 一元 & 运算符的操作数应该是函数指示符、[] 或一元 * 运算符的结果,或者是一个左值,它指定一个不是位域且未使用寄存器存储类说明符声明的对象

[...]

执行环境中数据存储的对象 区域,其内容可以表示值

所以,是的,联合是一个对象,因此只要满足其他要求,它就可以是 & 的操作数。

于 2013-03-16T01:38:43.193 回答