说明
- 在数据结构范畴内,堆是一种排序的方式,栈是一种“先进后出”的数据结构。
- 在内存分配的范畴内,堆是一种存储区间,该区间通过链表的方式进行组织;栈也是一种存储区间,该区间的操作类似数据结构中栈的操作方式--“先进后出”。
内存分配
- 静态存储区
- 栈区
- 堆区
- 代码存储区
- 常量存储区
对比说明表
分区 | 存放内容 | 申请与释放 | 特别说明 |
---|---|---|---|
静态存储区 | 全局变量、静态变量 | 编译器自动申请与释放 | 初始化的放在一个子区域,未初始化的放在另一个区域。 |
栈区 | 局部变量、函数参数、函数体地址 | 编译器自动申请与释放 | 操作方式类似数据结构中的栈“先进后出” |
堆区 | 自定义内容 | 程序员自动申请或释放 | malloc、new可申请资源、free、delete可释放资源。 未主动释放的资源,在程序结束时有系统释放。 资源的申请由系统从空闲内存链表中分配。 |
代码存储区 | 程序本身的二进制数据 | 编译器申请,系统释放 | |
常量存储区 | 常量数据如字符串常量 | 编译器申请,系统释放 |
示例
//main.cpp
int a = 0; //a全局初始化区
char *p1; //p1全局未初始化区
int main(){
int b; //b 栈
char s[] = "abc"; //s 栈; "abc\0"常量区
char *p2; //p2 栈
char *p3 = "123456"; //"123456\0"在常量区; p3 栈。
static int c =0; //c 全局(静态)初始化区
p1 = (char *)malloc(10); //分配的10个字节在堆区
p2 = (char *)malloc(20); //分配的20个字节在堆区。
strcpy(p1, "123456"); //"123456\0"放在常量区,与p3所指向的"123456"是一个地方。
}