前言:C语言二进制映像文件由,堆,栈,数据段(只读数据段,未初始化数据段BSS,已初始化数据段),代码段组成
1.栈区:由编译器进行管理,自动分配和释放,存放的是函数调用时的各种参数,局部变量,返回值,和函数返回的地址。
2.堆区:由程序员管理,用malloc和free动态申请和释放,如未释放,在程序运行结束OS会自动收回。
3,全局(静态)储存区:分为DATA(已初始化),BSS(未初始化)段,DATA存放的是全局变量和静态变量,BSS存放的是未被初始化的全局变量和静态变量,程序运行结束后自动释放。其中BSS(全部未初始化区)会被系统自动清零。
4,文字常量区,存放常量字符串,程序结束后由系统释放
5,程序代码段:存放程序的二进制代码
堆和栈的区别:
①申请方式:
Strack(栈): 由编译器自带分配释放,存放函数的参数值,局部变量等。
Heap(堆):程序员自己申请,并指名大小-->malloc函数。
②申请后的系统响应
Strack(栈):只要栈剩余空间>所申请空间,都会提供。
Heap(堆):操作系统有记录空闲内存的链表:收到申请->遍历链表->寻找->申请空间的堆结点
③申请内存的大小限制
Strack(栈):向低地址扩展的数据结果,连续内存区域,栈 获得的空间较小。
Heap(堆):向高地址扩展的,不连续内存区域;链表遍历方向为(低地址->高地址)。
堆获得空间灵活,空间也大。
④申请效率
Strack(栈):系统自由分配,速度快。
Heap(堆):速度慢,容易产生内存碎片。
⑤存储内容
Strack(栈):第一进栈 :主函数中的下一条指令的地址 -->函数的各个参数,参数由右往左进栈。-->函数的局部变量(静态变量不入栈)。调用结束后,顺序相反,局部变量先出栈。
Heap(堆): 程序员自己安排
⑥分配方式
Strack(栈):栈 有两种分配方式,静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配,动态分配由alloca函数进行分配,但栈的动态分配和堆是不同的,栈的动态内存由编译器进行释放,无需手工实现。
Heap(堆):堆都是动态分配的,没有静态分配的堆。
标签:初始化,Strack,区别,静态,程序,内存,Heap,分配 From: https://www.cnblogs.com/hetaoBlog/p/17233900.html