程序的内存分配C,堆和栈的区别

前言: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():堆都是动态分配的,没有静态分配的堆。

posted @   HxxxTENCTION  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示