在没有变量的情况下访问返回联合的字段是否合法?
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 不喜欢这种结构并且会像地狱一样发出警告。它的问题是它必须在内部生成一个不可见的变量才能访问 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);
}
这种情况与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);
,这显然是明确的。
我有一个返回 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 不喜欢这种结构并且会像地狱一样发出警告。它的问题是它必须在内部生成一个不可见的变量才能访问 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);
}
这种情况与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);
,这显然是明确的。