我输入了这段代码:
void main()
{
int *a;
a = foo();
printf("%d\n", *a);
}
int* foo()
{
int b = 10;
return &b;
}
编译后,有2个问题:
1. error - Conflicting type for foo()
2. warning - function returns address of local variable
但后来我写了这个
int* foo();
void main()
{
int *a;
a = foo();
printf("%d\n", *a);
}
int* foo()
{
int b = 10;
return &b;
}
现在,它在编译后没有出错,这是显而易见的,但是,为什么编译器没有给返回本地变量地址的警告?
声明或不声明函数如何影响返回局部变量的地址?
很抱歉之前没有提及,但我使用的是GNU GCC编译器
答案 0 :(得分:0)
除了语法错误之外,C标准不要求编译器发出警告。
ISO / IEC 9899:1999,5.1.1.3:
符合要求的实施应至少产生一种诊断 消息(以实现定义的方式标识)如果a 预处理翻译单元或翻译单元包含一个 违反任何语法规则或约束,即使行为是 也明确指定为未定义或实现定义。 在其他情况下不需要生成诊断消息。
您描述的行为不一致(即不好)但有效/符合标准。
答案 1 :(得分:0)
除语法错误外,编译器不需要向您发出警告或错误。编译器可能会或可能不会检测语义错误,具体取决于具体情况。
虽然标准是额外的,但不是标准要求。
在你的情况下,不一致有点不幸。
答案 2 :(得分:-1)
您必须在调用之前声明您的函数。在第一种情况下,您调用了foo然后定义了它。尝试这样,它应该工作:
int* foo()
{
int b = 10;
return &b;
}
void main()
{
int *a;
a = foo();
printf("%d\n", *a);
}