一个奇怪的问题 求解释
#include <iostream>
using namespace std;
int * getPtr(){
int number = 3;
return &number;
}
int main(){
int * ptr = getPtr();
int number;
number = *ptr;
cout <<"number = "<<number<<endl;
number = *ptr;
cout <<"number = "<<number<<endl;
return 0;
}
第一次结果是3
第二次结果是1245000
为什么 ?
[解决办法]
int number = 3;
number是一个局部变量,在栈上,函数退出后就无效了,有可能被别人使用,所以结果不确定。
[解决办法]
#include <iostream>
using namespace std;
int * getPtr(){
int number = 3;//这里是在栈上分配的变量
return &number;//在这个函数执行完之后number 的空间会被释放
} //空间释放代表这个位置可以被重用,还没被重用之前,里面的值还是3
int main(){
int * ptr = getPtr();
int number;
number = *ptr;
cout <<"number = "<<number<<endl;//这是还没有被重用 所以还是3
number = *ptr;
cout <<"number = "<<number<<endl;//这时候被重用的 因此值变了,里面存的是什么,没人知道
return 0;
}
什么时候会被重用是未知的,因此不要这样操作
[解决办法]
int * getPtr(){
int number = 3;//这是一个临时变量,当函数调用结束后,它的内存空间会被释放
return &number;
}
int * ptr = getPtr();
int number;
number = *ptr;
第一次调用getPtr()函数结束时,这个函数中的变量number所占用的空间会被释放,但其空间中的内容有可能被别的值所覆盖,也可能还没被覆盖,是个不确定的值,你第一次输出3,其值可能还没被覆盖,而指针ptr仍然指向这个空间,第二次调用的时候,这个空间的值被别的值覆盖了,所以输出结果不一样