一、c语言五大内存分区

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

文章福利】小编推荐自己的linuxC/C++语言交流群:【1106675687】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!~直通车

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

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

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

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

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

2.左边是UNIX系统的执行文件,右边是进程对应的逻辑地址空间的划分情况

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

四、存储类型关键字定义变量与函数作用域与生命周期

  • uto变量:函数的局部变量,如果没有声明为static,函数中定义的局部变量全部为auto类型,auto变量包括未加static声明的局部变量和函数的形参。在函数调用时系统会给他们分配存储空间,在函数调用结束后会自动释放这些空间。属于动态存储方式。
  • static变量:用static声明的局部变量在调用结束后不会消失而保存原来的值。static局部变量定义使用后值会存储下来。所以使用static局部变量定义只需要一次赋值。静态局部变量的作用域仅限于所定义的函数。但函数结束后变量的值会保留。直到整个程序运行结束。全局变量从定义开始作用于整个文件直至程序运行结束。
  • register寄存器变量:寄存器变量可以提高c语言的执行效率,即将局部变量的值存入CPU的寄存器中。需要注意的是!!!:1.只有动态存储的变量(自动局部变量和形参)才可以作为寄存器变量来存储,局部静态变量不可以定义为寄存器变量。2.计算机的寄存器数目是有限的,所以不能定义任意多个寄存器变量。
  • extern外部变量:即全局变量的外部表现形式,是在函数外部定义的变量。全局变量的作用域为从定义开始到源文件结束。exten对该变量作外部变量声明,扩展变量作用域。

五、堆与栈的区别

1.申请方式

  • stack:栈;由系统自动分配,自动开辟空间
  • heap:由程序员自己申请并指明大小,c中malloc,c++中new。如p1=(char*)malloc(10);p2=(char*)new(10);但需要注意的是p1,p2本事是在栈中的

2.申请后系统的响应

  • 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出
  • 堆:首先操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。另外对于大部分系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete语句才能正确的释放本内存空间。另外由于找到的堆节点大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

3.申请大小的限制

  • 栈:在windows下栈是向低地址扩展的数据结构,是一块连续的内存区域。所以栈的栈顶地址和最大容量是系统预先设定好的。在windows下栈的大小是2M.因此能从栈获得的空间比较小。
  • 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是是由于系统用链表来存储空闲内存地址的,所以是不连续的。而链表的遍历方向是由低地址到高地址。堆得大小受限于计算机系统中有效的虚拟内存大小。相比较而言堆获得的空间比较灵活,也比较大。

4.申请效率的比较

  • 栈:由系统自动分配,速度较快,但程序员是无法控制的。
  • 堆:由new分配的内存,一般速度比较慢,而且比较容易产生内存碎片,不过用起来最方便。

5.堆和栈中的存储内容

  • 栈:在函数调用时,第一个进栈的是主函数中的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数。在大多数c编译器中,参数是由右往左压栈的,然后是函数中的局部变量。静态变量是不入栈的。当函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,,也就是主函数的下一条指令,程序由该点继续执行。
  • 堆:一般是在堆的头部用一个字节存放堆得大小,其他内容自己安排。

6.存取效率的比较

1 char str1[]="aaaaaa";
2 char *str2="cccccc";

第一行是在运行时刻赋值的,第二行是在编译时就已经确定的,但在以后的存取过程中,在栈上的数组比指针指向的字符串快。


keil内存溢出表现_详细讲解C语言五大内存分区与可执行程序的三段(Text段、Date段、Bss段)【建议收藏】...相关推荐

  1. Java内存五大区_一:jvm的五大内存区(内存结构)

    本地方法栈:和虚拟机栈类似,只是它描述的是为虚拟机是用到的Native方法出栈和入栈的过程(通常我们不需要了解这块,它底层是C语言实现的). 虚拟机栈:描述的是线程进栈出栈的过程,线程结束内存自动释放 ...

  2. linux 内存溢出排查_记一次JAVA 线上故障排查完整套路

    JAVA线上故障排查全套路 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也 ...

  3. linux 内存溢出排查_【开发者成长】JAVA 线上故障排查完整套路!

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 线上故障主要会包括 CPU.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以 ...

  4. java 内存溢出分析_用一段时间后java内存溢出问题分析(转)

    几乎每个月都有出现因为内存溢出的问题,除了需要多分配内存外, 是不是要考虑对代码进行一些处理.. 下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方. 1.尽量在合适的场合使用单例 使 ...

  5. 内存超频时序怎么调_电脑内存条专业科普,内存选购、内存品牌、内存安装、内存时序体质、内存超频频率详细讲解...

    有很多兄弟经常问,什么牌子的内存条好啊?我用PS.剪辑软件需要多大内存条?内存条怎么超频啊? 所以,今天我们来详细讲解一下内存条. 一.什么是内存条? 内存条又叫随机存取存储器(英文缩写RAM),是与 ...

  6. gateway 内存溢出问题_带你学习jvm java虚拟机 arthas/性能调优/故障排除/gc回收/内存溢出等...

    学完本课程,您将掌握: 内存溢出问题实战 CPU飙升问题实战 阿里巴巴Arthas在线诊断 Class字节详细拆解 手写类加载器.四种类加载器.双亲委托模型 对象创建.存储.访问.加载解析 性能调优. ...

  7. python读取视频占用内存太大_视频流用多进程读写,内存溢出怎么办?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import gc import os from multiprocessing import Manager, Process import cv2 v ...

  8. idea内存溢出解决_各种OOM代码样例及解决方法

    针对目前大家对OOM的类型不太熟悉,那么来总结一下各种OOM出现的情况以及解决方法.把各种OOM的情况列出来,然后逐一进行代码编写复现和提供解决方法. 1. 堆溢出-java.lang.OutOfMe ...

  9. java内存溢出前端_【面试笔录】内存溢出和内存泄漏

    一.Java是如何管理内存的 在Java中,我们需要通过new关键字为每一个对象申请内存空间(基本数据类型除外),所有的对象都是在堆(Heap)中分配空间的. 在Java中,内存的分配是管理员决定的, ...

最新文章

  1. c语言 狸抓兔子,捕捉猫狸的方法- 抓野猫的最好方法
  2. 你的中文大模型真的行吗?来用智源指数测测看
  3. 染色[SDOI2011]
  4. 动态输出html一些效果失效的处理
  5. SpringMVC跳转页面默认类型和转发、重定向的使用
  6. Linux编译安装Python3
  7. AngularJS操作DOM——angular.element
  8. Activiti-master activiti5 在线java web流程设计器画布整合视频教程
  9. go按行读取数据的坑
  10. 【MATLAB】三维曲线(plot3)
  11. mfc 对话框应用程序 如何利用按钮弹出另一对话框
  12. Tosca:键盘输入字符串
  13. php分片数据库,4、PHP测试分片集群
  14. Atitit 动态调用webservice与客户端代理方式调用
  15. C语言程序设计实践 4.4车牌号
  16. 夏普mx2608n网络扫描到计算机,【转载】夏普复印机网络扫描教程
  17. matlab gui 简介,Matlab中Powergui的介绍.pdf
  18. 关于移动TD测试用户的800元月话费补贴的解释
  19. FFMpeg编译之路
  20. PTA L2-043龙龙送外卖

热门文章

  1. 【clickhouse】clickhouse 原生监控
  2. 【Elasticsearch】es如何停用节点
  3. 【Flink】Buffer pool is destroyed
  4. 【ST4】Java 中的模板引擎 StringTemplate
  5. drools 7.x 领域语言dsl详细语法
  6. java连接Oracle和PostGreSQL
  7. 02-linux下 yum安装R环境和Rserve安装
  8. 小林求职记(三)一上来就围绕电商系统层层提问,我太难了....
  9. 封装JDBC—非框架开发必备的封装类
  10. SQL Server 2008 R2 安装