首先,本文的环境是windowx xp , vs 2008 9.0 21022.8 TRM,inter,
本文主要会讨论到堆,栈,常量,静态,全局等,具体的概念我也不知道如何定义了,本人也是菜鸟级别的,书看的少,有错误的地方,希望各位大虾指证
1。首先来讨论栈
先来个测试程序
void test() {
int a7 = 9;
}
int main()
{
int a1=1;
{
int a2=2;
}
int a3=3;
for (int a4=4; true; ) {
int a5 = 5;
break;
}
int a6 = 4;
test();
int a8 = 6;
return 0;
}
开出我们的法宝内存查看器(调试-窗口-内存)和监视器(调试-窗口-监视)
定个断点跟踪调试,在监视器中观察以上变量的地址,如
从图中我们看出来了a1的地址是0x0012ff60,现在打开内存来看这个地址
我们看到了0x0012FF60 01 00 00 00,我们该位置存放的是int, 代表的是以0x0012FF60 的是整型,在本人的机器上,是从高位读到底,具体的值就是0x00000001十进制就是1,例子举的不够好,假设
0x0012FF60 01 02 03 04 存放的是int,则(0x0012FF60)int=0x04030201 (0x0012FF60)char=0x01,大概就是这样,好了,到了这里我们可以看内存和监视变量
继续以上程序当步跟踪,具体不截图了,大家观察发现啥没有,我来总结一下
1.a1,a2,a3,a4,a5,a6内存是网低处分配的,0x0012FF60,0x0012ff54, 0x0012ff48, ..... 证明了栈是往低内存张的,在这里,我们这里暂时只讨论到这,至于张到啥个程度,今后有机会讨论(1)
2.变量之间有8个字节,大家注意到没有如我们上图的02 00 00 00 cc cc cc cc cc cc cc cc 01 00 00 00 这中间加的这为什么呢?哦,我们是debug模式,当然是来校验栈是否被破坏啦,具体的我们有机会讨论(2)
3.大家看代码,注意&a2,和&a3,这一点小菜我当时也预计错了,以为&a3会和&a2相同因为&a2已经没有用了嘛,可是事实说明在a2生存周期过后,栈顶指针是不变的,也就是说a2位置处还是原来a2的内容,除非当前函数退出,会产生叫做栈展开的当然会改变栈顶指针了,如果a2是一个类的化,析构肯定是会调用的。
4.注意&a3, &a4, &a5, 其实这个规则也就是3所说的
5.&a6, &a7, &a8就是一个栈展开的例子,假设a8后还有a9, a10.....,到一定的时候,会吧a8内容覆盖的
6,当然了,栈空间是有限的,具体的限制范围,今后有机会讨论吧(3)
好了,对栈的讨论我们就到这了
累了,对于堆,下次有机会再讨论吧