代码段:通常是指用来存放程序执行代码的一块内存区域,内存区域通常属于只读,某些架构也允许代码段可写
数据段:通常是指用来存放程序中已初始化的全局变量的一块内存区域,属于静态内存分配
堆:堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上,当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈:栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。
除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。
我们可以把堆栈看成一个寄存、交换临时数据的内存区。
代码段 |
全局(静态)变量 |
栈(局部) |
堆(动态内存) |
生命周期 | 默认值 | 作用域 | 内存区域 | 链接属性 | |
普通全局变量 | 程序开始运行创建 程序结束即销毁 周期长 | 0 | 定义变量开始到文件结束 整个文件 | 全局(静态)变量区 | 外部 |
静态全局变量 | 程序开始运行创建 程序结束即销毁 周期长 | 0 | 定义变量开始到文件结束 整个文件 | 全局(静态)变量区 | 内部 |
普通局部变量 | 进入函数创建 函数结束销毁 周期短 | 随机值 | 本函数 | 栈区 | 无 |
静态局部变量 | 进入函数创建 直到程序结束销毁 | 0 | 函数内 | 全局(静态)变量区 | 无 |
堆区 |