首页 > 系统相关 >程序的内存分配C,堆和栈的区别

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

时间:2023-03-19 18:45:53浏览次数:34  
标签:初始化 Strack 区别 静态 程序 内存 Heap 分配

前言: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

相关文章

  • 如何分析PG数据库内存告警
    导读PG数据库遇到内存问题要立即进行分析的场景并不多,因为大多数PG数据库的内存使用率过高的报警并不意味着内存使用情况异常,内存真的不够用了。因为PG数据库是使用DOU......
  • SQL Server 2022 新特性 - 内存授予反馈:持久性和百分比授予
    内存授予反馈(MGF)是SQLServer中的一项现有功能,SQLServer2022中提供了两项重要改进:反馈持久性和百分比授予反馈。这两个功能增强了内存授予反馈的好处,因为它已经存在......
  • 记第一次正式参加程序设计竞赛(程序设计天梯赛校赛)的感觉(随便写写)
    背景2021年冬天到2022年春天开始在学校的相关课程下接触计算机,了解到算法竞赛的一些东西,2022年春天也参加了一次,虽然那次是线上赛,而且没什么准备,到了比赛的时候只会做一些......
  • 如何更换内存条
    title:如何更换内存条date:2023-03-1812:00:00categories:小技能tags:内存条内存拆机如何更换内存条三分钟教你给笔记本升级安装内存条,惠普745G5升级......
  • 温习:进程和线程的区别
    进程和线程的区别:1、定义不一样,进程是执行中的一段程序,线程是进程里执行中的任务,一个进程里可以有多个线程。2、一个线程只能属于一个进程。3、线程无地址空间,它包括在......
  • CountDownLatch 和 CyclicBarrier 的区别?
    CyclicBarrier它允许一组线程互相等待,直到到达某个公共屏障点(CommonBarrierPoint)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier......
  • synchronized 和 Lock 的区别
    Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock......
  • 微信小程序的复制粘贴
    小程序的复制OnCopy(){wx.setClipboardData({data:传入要复制的文本,})},将要复制的内容传入data中,系统会有相关提示的,然后还有success,fail,和c......
  • 熟悉JVM吗?为什么新生代内存需要有两个Survivor区?
    在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区?为什么要有Survivor区如果没有Survivor,Eden区每进行一次MinorGC,存活的对象就会被送到老年代。老年代很快被......
  • 能不能说一说 TCP 和 UDP 的区别?
    TCP是一个面向连接的、可靠的、基于字节流的传输层协议。而UDP是一个面向无连接的传输层协议。和 UDP 相比,TCP有三大核心特性:面向连接。所谓的连接,指的是客户端和服......