C中局部变量的返回地址

mar*_*ary 12 c return return-value

说我有以下两个功能:

1

int * foo()
{
  int b=8;
  int * temp=&b;
  return temp;
}
Run Code Online (Sandbox Code Playgroud)

2

int * foo()
{
   int b=8;
   return &b;
}
Run Code Online (Sandbox Code Playgroud)

我没有得到任何警告第一个(例如函数返回局部变量的地址)但我知道这是非法的,因为b从堆栈中消失,我们留下指向未定义内存的指针.

那么我什么时候需要注意返回临时值的地址?

Fil*_*efp 18

你没有在第一个片段中收到警告的原因是因为你没有(从编译器的角度来看)将地址返回给局部变量.

你正在返回的值int * temp.尽管此变量可能(并且在此示例中)包含一个值,该值是局部变量的地址,但编译器不会上升到代码执行堆栈以查看是否是这种情况.

注意:两个片段都同样糟糕,即使您的编译器没有警告您前者.不要使用这种方法.


将地址返回到局部变量时应始终小心; 作为一项规则,你可以说你永远不应该.

static变量是一个完全不同的情况,正在这个线程中讨论.

  • 这意味着您正在调用我们通常所称的*[未定义行为](http://en.wikipedia.org/wiki/Undefined_behavior)*,即.标准中未指定的行为. (3认同)