返回本地变量错误的地址

时间:2016-02-08 05:31:53

标签: c pointers

我输入了这段代码:

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

3 个答案:

答案 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);
}