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

时间:2013-03-16 01:31:20

标签: c unions

我想做这样的事情:

union U {
    int i;
    double d;
};

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

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

gcc没有抱怨(使用-Wall -Wextra)并且它按预期工作,但我想确保它实际上是合法的(根据标准)。

3 个答案:

答案 0 :(得分:6)

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

  

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

(C11,§6.7.2.116)

(这意味着你可以获取指向工会成员的指针)

答案 1 :(得分:4)

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

答案 2 :(得分:3)

C99:

  

6.5.3.2

     

地址和间接运营商

     

约束

     
      
  1. 一元&的操作数运算符应该是函数指示符,结果   一个[]或一元*运算符,或指定一个对象的左值   这不是一个小字段,也不是用寄存器声明的   存储级别指定
  2.   

[...]

  

<强>对象    执行环境中的数据存储区域   其内容可以代表值

所以,是的,联合是一个对象,因此可能是&amp;的一个操作数。只要它符合其他要求。