c语言五大内存分区-(堆,栈,全局/静态存储区,自由存储区,代码区)与可执行程序的三段-(Text段,Date段,Bss段)

一、c语言五大内存分区

  1. 栈区(stack):存放函数形参和局部变量(auto类型),由编译器自动分配和释放
  2. 堆区(heap):该区由程序员申请后使用,需要手动释放否则会造成内存泄漏。如果程序员没有手动释放,那么程序结束时可能由OS回收。
  3. 全局/静态存储区:存放全局变量和静态变量(包括静态全局变量与静态局部变量),初始化的全局变量和静态局部变量放在一块,未初始化的放在另一块
  4. 文字常量区:常量在统一运行被创建,常量区的内存是只读的,程序结束后由系统释放。
  5. 程序代码区:存放程序的二进制代码,内存由系统管理


 二、可执行程序程序三段-Text段,Date段,Bss段

                   

   1.一个程序的3个基本段:text段,dtae段,bss段

  • text段在内存中被映射为只读,但date段与bss段是可写的
  • text段:代码段,就是放程序代码的,编译时确定,只读
  • date段:存放在编译阶段(而非运行时)就能确定的数据,可读可写。也就是通常所说的静态存储区,赋了初值的全局变量和赋初值的静态变量存放在这个区域,常量也存在这个区域
  • bss段:已经定义但没赋初值的全局变量和静态变量存放在这个区域。



两者之间区别是:代码段,数据段,堆栈段是cpu级别的概念,五大分区属于语言级别的概念,两者是不同的概念。




三、可执行程序内存空间与逻辑地址空间的映射与划分

                               

  • 左边是UNIX系统的执行文件,右边是进程对应的逻辑地址空间的划分情况
    • 首先是栈区(堆栈区stack),堆栈是由编译器自动分配释放,存放函数的参数和局部变量的值(auto类型),操作方式类似于数据结构中的栈。栈的申请是由系统自动分配,如在函数内部申请一个局部变量int h,同时判断所申请空间是否小于栈的剩余空间,如果小于则为其开辟空间,为程序提供内存,否则将报异常提示栈溢出。
    • 堆(heap),堆一般由程序员分配释放,若程序员不释放,程序结束可能由OS回收。它与数据结构中的堆是两回事,分配方式类似于链表,申请则是程序员自己操作使用malloc或new。申请过程比较复杂,当系统收到程序的申请时,会遍历记录空闲内存地址的链表,以求寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序,有些情况下,新申请的内存块的首地址记录本次分配的内存块的大小,这样在delete尤其是delete[]时能正确的释放内存空间。
    • 下边是全局静态存储区,全局变量与静态变量的存储是放在一块的,初始化的全局变量与静态变量存放在一块区域,未初始化的全局变量与未初始化的静态变量存放在相邻的另一块区域。
    • 文字常量区,常量字符串就是放在该部分,只读存储区,程序结束后由系统释放
    • 程序代码区,存放程序的二进制代码区。 

猜你喜欢

转载自www.cnblogs.com/southcyy/p/10167005.html