一个网友在论坛上的问题:
请先看一下这段代码:
#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,第二次是随机的。getPtr()函数调用完不是销毁了吗,栈指针向下移动,收回存储空间,但是number=3还在那一块空间里,执行第一次cout难道没有把它覆盖掉么,为什么还能输出正确结果?
一个网友的回答:
cout<<之前,没有函数调用,栈区虽被销毁,便里面的值没变,所以number=3
第一次cout<<后,调用了cout对象的成员函数,栈被覆盖,内存中的值改变了。
另一个网友的回答:
当一个堆栈上的变量在其所在的函数返回后,在进入另一个函数之前的数据应该还是完好的,否则就会是垃圾数据了.
如果可以的话,lz应该学会查看反汇编代码,或者使用数据断点来观察数据的动态变化,这样才能提升自己.
笔者的话:
上述两位网友的回答,已经圆满解答了这个问题。
类似于这类问题,其实应该要学会自己去看汇编代码,这个可以帮你暂时解惑。
如果想彻底弄懂这类问题,需要静下心来看几本书,一些编程领域的经典教材,而不是总是去看那些快餐一样的编程书籍。