栈中数据的动态存储与销毁
来源:互联网 发布:淘宝产品运营 编辑:程序博客网 时间: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应该学会查看反汇编代码,或者使用数据断点来观察数据的动态变化,这样才能提升自己.
笔者的话:
上述两位网友的回答,已经圆满解答了这个问题。
类似于这类问题,其实应该要学会自己去看汇编代码,这个可以帮你暂时解惑。
如果想彻底弄懂这类问题,需要静下心来看几本书,一些编程领域的经典教材,而不是总是去看那些快餐一样的编程书籍。
- 栈中数据的动态存储与销毁
- 子容器的动态生成与销毁
- 存储在云端的数据可以真正销毁掉吗
- 内核中线程的创建与销毁
- 常量字符串存储与销毁引发的误解
- 函数的栈帧创建与销毁
- 函数栈帧的创建与销毁
- 浅谈VC中CDialog的创建,存活与销毁。
- C语言中程序与数据的存储位置
- numpy中二进制格式的数据存储与读取
- 堆栈的顺序存储结构实现1——堆栈的创建与销毁
- 本地存储动态请求的数据
- java中数据的5种存储位置(堆与栈)
- Java中数据存储方式、栈机制与引用的关系
- java中数据的5种存储位置(堆与栈)
- 变量的存储类别,静态存储与动态存储
- 动态二维数组的创建及指针的传递与销毁
- 数据的存储与查找
- 观《王刚讲故事》有感
- GRE满分女生经验谈(完整版)
- 回顾MySpace架构的坎坷之路
- IOCP
- WinCE下定制触摸校准界面的方法
- 栈中数据的动态存储与销毁
- 第3篇TinyOS/NesC程序的基本结构和入手写法(教程lesson 1 blink)
- 待调研的项目管理工具记录
- Android体系结构
- asp.net 常用快捷键
- Android方向研究
- gnuplot 让您的数据可视化
- Cellular Emulator无法启动,显示COM17 is used, please verify
- 数据库应用中并发控制若干实现途径