在没有变量的情况下访问返回联合的字段是否合法?

Is it legal to access a field of a returned union without a variable?

我有一个返回 union 类型的函数。标准 (C99) 是否允许直接从调用访问返回值的字段,而无需将值复制到变量。这里有一个例子来说明我的意思:

union thinga { int integ; char arr[4]; };

union thinga f(void)
{
  union thinga t = {.integ = 1};
  return t;
}
int main(void)
{
   printf("thinga is %d\n", f().integ);
}

可以调用字段f().integ吗?在我的示例中,它是 union,但问题与 struct 相同。 我问这个问题,因为我清楚地记得 Solaris 上的 gcc 3.3 不喜欢这种结构并且会像地狱一样发出警告。它的问题是它必须在内部生成一个不可见的变量才能访问 structunion 的字段。较新的编译器似乎不介意该构造,但我想知道是否存在隐藏的问题(即我没有想到的 undefined bevaviour

编辑:好吧,看起来我设计的例子有点太简单了,正如评论者 2501 所注意到的,通过提供数组链接衰减到范围外对象的指针,让我们看看如果我改变我们是否处于相同的情况一点我的代码。

 union thinga f(const char *val)
 {
   union thinga t = {.integ = 0};
   t.arr[0] = val[0];
   return t;
 }

 int main(void)
 {
     printf(" thinga.integ=%d .arr=%s\n", f("1").integ, f("1").arr);
 }

这种情况与arrays that are not lvalues and sequence point restriction and Undefined behavior: when attempting to access the result of function call中给出的情况相同吗? (返回的值显然是实现依赖(endiannes),但这不是这里的问题)。

这是有效的,c 标准允许的,这段代码中没有未定义的行为。

编辑: 对于片段

 int main(void)
 {
     printf(" thinga.integ=%d .arr=%s\n", f("1").integ, f("1").arr);
 }  

f("1").arr 引用联合的 arr 元素。由于 arr 是一个数组,并且根据 C 规则,在此上下文中,数组将衰减为指向其第一个元素的指针。由于 t 是函数的局部变量(自动局部变量,一旦函数 return 将不再存在),访问 arr 元素将调用未定义的行为。

这与

完全相同
printf("thinga is %d\n", (union thinga) {.integ = 1}.integ);

,这显然是明确的。