程序的内存分配

栈区(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

相关文章
相关标签/搜索