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

Pat*_*ter 6 c unions

我有一个函数返回一个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);
}
Run Code Online (Sandbox Code Playgroud)

是否f().integ允许使用字段调用?在我的例子中它是一个,union但问题是相同的struct.我问这个问题,因为我清楚地记得Solaris上的gcc 3.3并不喜欢这种结构,并会像地狱一样警告.它的问题是它必须在内部生成一个不可见的变量,以便能够访问struct或者的字段union.较新的编译器似乎不介意构造,但我想知道是否有隐藏的捕获(即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);
 }
Run Code Online (Sandbox Code Playgroud)

这种情况与非左值和序列点限制未定义行为的数组中给出的情况相同:当试图访问函数调用的结果时?(返回的值显然是必要的deidennd(endiannes),但这不是问题).

hac*_*cks 3

这是有效的并且是 C 标准所允许的,并且此代码中没有未定义的行为。

编辑:对于片段

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

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

  • @LPs:我希望它与使用中间的命名变量一样是线程安全的。 (2认同)