此代码是否完全有效?在这里返回一个指针不会让我们陷入未定义的行为吗?
#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;
}
编辑:有效代码的外观如何?
答案 0 :(得分:7)
不,先生。那是无效的。您无法返回指向局部变量的指针。一旦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;
}
答案 1 :(得分:1)
int k。因此,我将指向一个未分配的内存部分。 ERROR
答案 2 :(得分:1)
不,它无效。 lab
返回指向变量局部变量的指针。 lab
存在后,该指针无效。访问它是未定义的行为。