【发布时间】:2012-02-05 04:20:48
【问题描述】:
gcc 4.4.4下的以下简单代码段错误
#include<stdio.h>
typedef struct Foo Foo;
struct Foo {
char f[25];
};
Foo foo(){
Foo f = {"Hello, World!"};
return f;
}
int main(){
printf("%s\n", foo().f);
}
将最后一行改为
Foo f = foo(); printf("%s\n", f.f);
工作正常。使用-std=c99 编译时,这两个版本都可以工作。我只是在调用未定义的行为,还是标准中的某些内容发生了更改,从而允许代码在 C99 下工作?为什么在 C89 下会崩溃?
【问题讨论】:
-
如果你打开警告,我会收到
warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char[25]’ -
请记住,
printf是那些有趣的可变参数函数之一。如果它被传递给一个接受char*参数的普通函数,那么它应该很好地衰减。但我认为它与printf的互动很有趣。 -
不是
Invalid use of non-lvalue array -
我正在使用“gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3”。你在用什么?
-
在 C 中,除了按值将其复制到另一个位置(到函数或局部变量中)之外,是否允许您对临时进行任何操作?也许答案是否定的。
标签: c linux gcc language-lawyer