返回本地变量地址的错误

3

I typed this code:

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编译器。


1
你使用的编译器是哪个?gcc(我的版本是4.8.4)在这两种情况下都会对本地变量返回地址发出警告。 - kaylum
我这里也是(Mac OSX - clang-700.1.81):你的 第二个 程序版本会导致 warning: address of stack memory associated with local variable 'b' returned [-Wreturn-stack-address] 警告。 - mauro
@jblixr 对于这种事情使用在线编译器并不是一个好主意。1. Codepad似乎根本不会显示任何警告。2. 您不知道与警告相关的编译命令行是什么。 - kaylum
1
@jblixr 嗯,你说得对。有趣。但是对于OP(和你),问题仍然是一样的。使用哪个编译器?如果你想深入了解,那就找出codepad使用的编译器是什么。任何答案都将是特定于编译器的。 - kaylum
2
问题是关于特定编译器的行为,因此您应在问题中包括您的编译器名称和版本。 - M.M
显示剩余7条评论
3个回答

0

C标准不要求编译器除语法错误外发出警告。

ISO/IEC 9899:1999, 5.1.1.3:

符合规范的实现应该产生至少一条诊断消息(以实现定义的方式标识),如果预处理翻译单元或翻译单元包含任何语法规则或约束的违规,即使行为也明确指定为未定义或实现定义。在其他情况下不需要产生诊断消息。

您所描述的行为是不一致的(即不好的),但是有效的/符合标准。


0

编译器除了语法错误外,不一定会给出警告或错误提示。语义错误可能会被编译器检测到,也可能不会,这取决于具体情况。

但这只是额外的功能,并非标准要求。

在您的情况下,不一致有点不幸。


-3

在调用函数之前,您必须先声明它。在第一种情况下,您调用了foo,然后才定义它。请尝试像这样编写代码,应该就可以正常工作:

int* foo()
{
  int b = 10;
  return &b;
}

void main()
{
  int *a;
  a = foo();
  printf("%d\n", *a);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接