程序地址空间

在这里插入图片描述
上图也可以进一步细分:
在这里插入图片描述
1.栈区: 栈又叫堆栈,通常存放程序临时创建的非静态局部变量(即函数大括号中定义的局部变量)以及函数调用时的参数,调用后的返回值等。由编译器自动分配释放。栈是向下增长的。
  栈具有“小内存、自动化、可能会溢出”的特点。栈顶的地址和栈的最大容量一般是系统预先规定好的,通常不会太大。由于栈中主要存放的是局部变量,而局部变量的占用的内存空间是其所在的代码段或函数段结束时由系统回收重新利用,所以栈的空间是循环利用自动管理的,一般不需要人为操作。如果某次局部变量申请的空间超过栈的剩余空间时就有可能出现 “栈的溢出”,进而导致意想不到的后果。所以一般不宜在栈中申请过大的空间,比如长度很大的数组、递归调用重复次数很多的函数等等。

2.堆区: 通常存放程序运行中动态分配的存储空间。它的大小,并不固定,可动态扩张或缩放。当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张),释放的内存从堆中被提出(堆被缩减)。堆与数据结构中的堆是两回事,分配方式类似于链表。堆是向上增长的。
  堆具有“大内存、手工分配管理、申请大小随意、可能会泄露”的特点,堆内存是操作系统划分给堆管理器来管理的,管理器向使用者(用户进程)提供API(malloc和free等)来使用堆内存。需要程序员手动分配释放,如果程序员在使用完申请后的堆内存却没有及时把它释放掉,那么这块内存就丢失了(进程自身认为该内存没被使用,但是在堆内存记录中该内存仍然属于这个进程,所以当需要分配空间时又会重新去申请新的内存而不是重复利用这块内存),就是我们常说的-内存泄漏,所以内存泄漏指的是堆内存被泄露了。

3.静态区(全局数据区)(static): 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(数据区),未初始化的全局变量和静态变量在相邻的另一块区域(BSS区)。另外文字常量区,常量字符串就是放在这里,程序结束后由系统释放。
  数据区(全局初始化数据区 data):该区包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)。
  BSS区(未初始化数据区):存入的是全局未初始化变量。BSS这个叫法是根据一个早期的汇编运算符而来,这个汇编运算符标志着一个块的开始。BSS区的数据在程序开始执行之前被内核初始化为0或者空指针(NULL)。llinux环境下可以用size命令 查看C程序的存储空间布局,可以看出,此可执行程序在存储时(没有调入到内存)分为代码区(text)、数据区(data)和未初始化数据区(bss)3个部分。

一个正在运行着的C编译程序占用的内存分为代码区、初始化数据区、未初始化数据区、堆区和栈区5个部分。

4.代码区(text): 用来存放CPU执行的机器指令,也有可能包含一些只读的常数变量,例如字符串常量等。通常,代码区是可共享的(即另外的执行程序可以调用它),因为对于频繁被执行的程序,只需要在内存中有一份代码即可。这部分区域的大小在程序运行之前就已经确定,通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。
常量区其实是一块不同于代码区的区域,但是因为常量和代码一样具有只读性质,所以有时候说代码段是包含了常量区的。

5、共享区: 用来装载一个共享的动态内存库;用户还可以使用系统接口创建共享内存,做进程间通信。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值