内存中的堆和栈
程序在内存中分为以下几个部分:
1、栈区:
由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区:
由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 ,分配方式类似于链表。
3、全局区
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区
常量字符串就是放在这里的, 程序结束后由系统释放。
5、程序代码区
存放函数体的二进制代码。
堆 | 栈 | ||
---|---|---|---|
内存 | 分配 | 由程序分配:malloc/new | 由编译器自动分配 |
– | 释放 | 一般由程序员分配释放。若程序员不释放,程序结束时可能由OS回收 。free/delete | 由编译器自动释放 |
作用 | 程序运行时申请的动态内存:malloc/free或者new/delete | 存放函数的参数值,局部变量的值等 | |
特性 | 先入后出 | ||
大小 | 受限于虚拟内存 | 编译器决定,一般为1M | |
内存空间 | 向高地址扩展,不连续的内存区域 | 向低地址扩展,一块连续的内存的区域 |
数据结构的堆和栈
数据结构:元素按一定规则排列,并满足一定的操作方式
堆
性质:
1、堆中的某个节点的值总是不大于或者不小于其父节点的值:根节点最大,叫最大堆;根节点最小,叫最小堆
2、总是一颗完全二叉树
栈
性质:
1、只允许再一端进行插入和删除,此端为栈顶,另一端为栈底
2、先入后出