首先,本文的环境是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)

好了,对栈的讨论我们就到这了

累了,对于堆,下次有机会再讨论吧