繁体   English   中英

局部变量的返回地址错误

[英]Returning address of a local variable error

我输入以下代码:

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

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

编译后,有两个问题:

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

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

ISO / IEC 9899:1999,5.1.1.3:

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

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

编译器不需要向您发出警告或错误,语法错误除外。 取决于情况,编译器可能会或可能不会检测到语义错误。

那是多余的,但不是标准要求的。

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

您必须在调用函数之前声明它。 在第一种情况下,您调用了foo,然后定义了它。 像这样尝试,它应该可以工作:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM