首先需要明确,通常所说的内存堆栈和数据结构中的堆栈并不是一个概念。
我们知道,程序一般存放在ROM(只读内存),在程序运行的时候,会将程序拷到RAM(随机存储器)中,同时,会在其中生成程序运行所需的常量,变量等信息。RAM存储的逻辑空间如下图所示(以C语言为例):

1、栈
用于存放程序定义的局部变量,当需要存储新的变量时,从高位往地位扩展空间
- 系统自动分配和回收栈空间
- 在内存中连续存储,所以分配和读取速度较快
- 空间较少,超出时会提示栈溢出
- 一旦分配完成,不能更改所占用的内存大小
2、堆
由程序员在程序中主动申请的内存空间,从低位往高位扩展空间
- 由程序员主动申请内存空间,不使用时需要显式释放,或者程序退出时释放,如果使用完成不释放,容易导致内存泄露
- 操作系统维护一个记录空闲内存地址的链表,当需要申请内存空间时,会从低地址到高地址遍历链表,找出大于申请内存的空间分配给程序使用,将分配后剩余的内存重新维护成一个新的空闲节点。存储空间不连续
- 和栈相比,可分配的空间较大
- 分配完成之后,还可以重新调节变量所占用的内存地址大小
可读写区
用于存放全局变量和静态变量,与上面两种分配内存的时间不同,可读写区在程序编译器就会为变量分配地址
只读区
用于存放程序和常量
网友评论