栈中数据的动态存储与销毁

来源:互联网 发布:淘宝产品运营 编辑:程序博客网 时间:2024/05/18 03:46

一个网友在论坛上的问题:

帖子地址:http://topic.csdn.net/u/20110309/22/845029a8-09be-46d8-9eed-ea71a58466e7.html?seed=2111582295&r=72059166#r_72059166

请先看一下这段代码:
#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应该学会查看反汇编代码,或者使用数据断点来观察数据的动态变化,这样才能提升自己.

 

笔者的话:

上述两位网友的回答,已经圆满解答了这个问题。

类似于这类问题,其实应该要学会自己去看汇编代码,这个可以帮你暂时解惑。

如果想彻底弄懂这类问题,需要静下心来看几本书,一些编程领域的经典教材,而不是总是去看那些快餐一样的编程书籍。

原创粉丝点击