栈区(stack)程序员
由编译器自动分配释放,存放函数的参数值,局部变量的值等。其余操做相似于数据结构中的栈。数据结构
堆区(heap)函数
通常有程序员分配释放,若程序员不释放,程序结束后可能有OS回收。它和数据结构中的堆不是一回事,分配方式相似于链表。spa
全局区(静态区static).net
全局变量和静态变量存储在之一区域,初始化的全局变量和静态变量在这一区域,未初始化的全局变量和未初始化的静态变量在相邻的另外一区域。程序结束后由系统释放。unix
文字常量区blog
常量字符串存放在这一区域。程序结束后由系统释放。进程
程序代码区内存
存放函数体的二进制代码。ci
进程内存分配图
高地址
低地址 |
段区名 |
解释 |
内容 |
stack |
栈:局部变量 |
一、在函数内部定义的局部变量(非static型) 二、中断发生时存放的运行环境 |
|
room |
增加空间:堆向上长,栈向下长 |
堆和栈动态变化的空间, 一、堆从低地址向上动态增加 二、栈从高地址向下动态增加 |
|
heap |
堆:动态分配的内存空间 |
一、程序运行时动态分配的空间,如malloc函数,new等 二、动态释放,如free函数,delete等 |
|
other |
其余 |
|
|
.bss |
未初始化的全局变量区 |
函数外部定义的(全局变量),如 一、 int I; 二、 static int j; |
|
.data |
已初始化的全局变量区 |
一、函数外定义的:static int i = 0; 二、函数内部定义的:static int j;//编译器自动初始化为0 |
|
.text |
可执行文件 |
一、程序代码,即当前CPU的二进制机器码 二、常量,如const char msg[]=”hello world\n” |
注:
一、单片机,可执行文件通常不必加载到内存中,也就不存在.text段。
二、对于多任务系统来讲,一个进程的内存分配每每是动态的,所以堆区实际地址空间可能不连续。
三、栈区做为存放局部变量的区域,每每能够设置其最大大小,运行时超出定义大小则会产生越界错误(段错误的一种)。
unix系统进程内存占用示意图
参考:
https://blog.csdn.net/hitman_cs/article/details/70599071
https://blog.csdn.net/qq792326645/article/details/49783347