【基础】计算机内存分配-堆-栈等概念的区别

说明

  • 在数据结构范畴内,堆是一种排序的方式,栈是一种“先进后出”的数据结构。
  • 在内存分配的范畴内,堆是一种存储区间,该区间通过链表的方式进行组织;栈也是一种存储区间,该区间的操作类似数据结构中栈的操作方式--“先进后出”。

内存分配

  1. 静态存储区
  2. 栈区
  3. 堆区
  4. 代码存储区
  5. 常量存储区

对比说明表

分区 存放内容 申请与释放 特别说明
静态存储区 全局变量、静态变量 编译器自动申请与释放 初始化的放在一个子区域,未初始化的放在另一个区域。
栈区 局部变量、函数参数、函数体地址 编译器自动申请与释放 操作方式类似数据结构中的栈“先进后出”
堆区 自定义内容 程序员自动申请或释放

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"是一个地方。
}

参考链接

https://blog.csdn.net/shanchangyi/article/details/51854795

猜你喜欢

转载自blog.csdn.net/JasonZhu_csdn/article/details/82912079
今日推荐