最近有几个困扰我的问题:
- 什么是堆?
- 什么是栈?
- 区别与用途?
下面一一解答, 什么是堆?
举个栗子,从上往下看金字塔,塔尖就相当于堆的根,堆实际上是一棵完全二叉树,至于树是什么可以参考一下数据结构的知识,完全二叉树的叶子节点都在最后一层,并且这些叶子节点都是靠左排序的。
- 堆一般用new来分配,分配和释放必须一一对应 。
- 堆中某个节点的值总是不大于或不小于其父节点的值。
(在排序算法中堆排序就是按这个道理来的,将需要排序的数据放入大根堆中,堆在建立的时候就是根节点是数组中最大的节点,所以每次挤出根节点就为当前堆最大值,从而可以实现堆排序)
什么是栈? 栈可以看成是一个罐子,罐子可以装饼,每次将饼放进罐子里面高度都会升高,而旧的饼就被压在了下面,你想要拿出最下面的饼必须将上面的饼都拿出来,放进去,拿出来的操作对应的就是入栈跟出栈。 区别与用途? 数据结构中的堆跟栈是一个概念,是逻辑存在的。计算机操作系统中的栈是指一块内存区域。
不知道变量的大小,需要分配一块动态内存的时候可以用堆内存,而普通的局部变量则一般用栈来分配。
程序内存一般分为5大区
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能回收 。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后有系统释放 4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。
一个前辈写的例子:
int a = 0;
int a = 0;
char *p1;
main() {
int b;
char s[] = "abc";
char *p2;
char *p3 = "123456";
static int c = 0;
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
strcpy(p1, "123456");
}
|