[英]Returning a pointer in a good way
此代码是否完全有效? 将指针返回此处是否不会使我们陷入未定义的行为?
#include <iostream>
using namespace std;
int* lab(int* i) {
int k=9;
i=&k;
return i;
}
int main(void) {
int* i=0;
cout << *lab(i) << endl;
return 0;
}
编辑 :有效代码看起来如何?
不,先生。 那是无效的。 您不能返回指向局部变量的指针。 一旦lab()
退出, k
就不存在,并且取消指向它的指针会导致未定义的行为。
考虑一下k
的存储位置。 您采用的地址的自动变量存储在堆栈中。 进入函数时堆栈会增长,退出函数时堆栈会收缩。 当lab()
返回时,分配给k
的堆栈空间将被回收,并且可以由运行时重用,可能用于某些其他函数中的其他局部变量。
有两种方法可以解决此问题。 最简单的方法是让调用者提供一个存储值的位置,而不是让lab()
尝试查找空间。 这消除了当lab()
返回时k
被释放的问题。
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;
}
函数返回时,int k将被删除。 因此,我将指向内存的未分配部分。 错误
不,这是无效的。 lab
返回一个指向变量局部变量的指针。 一旦存在lab
该指针将无效。 访问它是未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.