首页 > 代码库 > 17.3.22--堆栈内存讲解
17.3.22--堆栈内存讲解
数据结构中的堆栈:
首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。
堆和栈都是一种数据项按序排列的数据结构。
栈就像装数据的桶或箱子
我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。
这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。
堆像一棵倒过来的树
而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。
通常我们所说的堆的数据结构,是指二叉堆。
堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。
C语言的堆栈:
然而我要说的重点并不在这,我要说的堆和栈并不是数据结构的堆和栈,之所以要说数据结构的堆和栈是为了和后面我要说的堆区和栈区区别开来,请大家一定要注意。
下面就说说C语言程序内存分配中的堆和栈,这里有必要把内存分配也提一下,大家不要嫌我啰嗦,一般情况下程序存放在Rom(只读内存,比如硬盘)或Flash中,运行时需要拷到RAM(随机存储器RAM)中执行,RAM会分别存储不同的信息,如下图
所示:
内存中的栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的。
栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。另外还有静态区是分配静态变量,全局变量空间的;只读区是分配常量和程序代码空间的;以及其他一些分区。
1 int a = 0; //全局初始化区 2 char *p1; //全局未初始化区 3 main() 4 { 5 int b; //栈 6 char s[] = "abc"; //栈 7 char *p2; //栈 8 char *p3 = "123456"; //123456\0在常量区,p3在栈上。
----->注意这个是匿名数组把地址给了p3,但是这个匿名数组的长度和数值和普通的比较起来,这个不能变长度和数值
----------->而普通的就可以
9 static int c =0; //全局(静态)初始化区 10 p1 = (char *)malloc(10); //堆 11 p2 = (char *)malloc(20); //堆 12 }
注意上面的加红字:
1)当你的程序点 保存 就会存到硬盘 这个和你将代码存在哪一个盘有关系
2)当程序一运行,那么就会把程序加载到内存 ,内存中不是单单存你的代码 而是关于代码的所有信息,详细见那个图
3)然后按照相应的顺序 进行运行程序。
详细的一个链接
http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html
17.3.22--堆栈内存讲解