假设我有以下两个功能:
1
int * foo()
{
int b=8;
int * temp=&b;
return temp;
}
2
int * foo()
{
int b=8;
return &b;
}
我没有收到第一个警告(例如,函数返回局部变量的地址),但我知道这是非法的,因为
b
从堆栈中消失,我们留下了一个指向未定义内存的指针。
那么什么时候我需要小心返回临时值的地址?
在第一个代码片段中没有收到警告的原因是因为您没有(从编译器的角度)返回局部变量的地址。
您正在返回
int * temp
的值。即使这个变量可能(在本例中)包含一个局部变量地址的值,编译器也不会向上执行代码堆栈来查看是否是这种情况。
注意:这两个片段同样糟糕,即使您的编译器不会就前者发出警告。不要使用这种方法。
将地址返回给局部变量时应始终小心;通常,您可以说您永远不应该。
static
变量是一种完全不同的情况,这正在这个线程中讨论。