不,先生。那是无效的。您不能返回指向局部变量的指针。一旦lab()
退出k
不存在并且取消引用指向它的指针会导致未定义的行为。
想想k
存储在哪里。您获取地址的自动变量存储在堆栈中。堆栈在函数进入时增长,在函数退出时收缩。当lab()
返回时,分配给的堆栈空间被k
回收并且可以被运行时重用,可能用于其他一些函数中的其他局部变量。
有几种方法可以解决这个问题。最简单的方法是让调用者提供一个存储值的位置,而不是lab()
尝试寻找空间。这消除了返回k
时被释放的问题。lab()
int* lab(int* i) {
*i = 9;
return i;
}
int main(void) {
int k;
cout << *lab(&k) << endl;
return 0;
}
另一种方法是声明k
为static
. 静态变量存储在某个地方的永久存储器中,而不是堆栈上,因此它们的地址在程序的整个生命周期内保持有效。
int* lab() {
static int k=9;
return &k;
}
还有一种方法是使用new
.
int* lab() {
int* i = new int;
*i = 9;
return i;
}
int main(void) {
int* i = lab();
cout << *i << endl;
delete i;
return 0;
}