c语言内存管理指对系统内存的分配、创建、使用这一系列操作。
在计算机中,每个应用程序之间的内存是相互独立的,通常情况下应用程序 a 并不能访问应用程序 b,当然一些特殊技巧可以访问,但此文并不详细进行说明。例如在计算机中,一个视频播放程序与一个浏览器程序,它们的内存并不能访问,每个程序所拥有的内存是分区进行管理的。
在计算机系统中,运行程序 a 将会在内存中开辟程序 a 的内存区域 1,运行程序 b 将会在内存中开辟程序 b 的内存区域 2,内存区域 1 与内存区域 2 之间逻辑分隔。
在程序 a 开辟的内存区域 1 会被分为几个区域,这就是内存四区,内存四区分为栈区、堆区、数据区与代码区。
栈区指的是存储一些临时变量的区域,临时变量包括了局部变量、返回值、参数、返回地址等,当这些变量超出了当前作用域时将会自动弹出。该栈的最大存储是有大小的,该值固定,超过该大小将会造成栈溢出。
堆区指的是一个比较大的内存空间,主要用于对动态内存的分配;在程序开发中一般是开发人员进行分配与释放,若在程序结束时都未释放,系统将会自动进行回收。
数据区指的是主要存放全局变量、常量和静态变量的区域,数据区又可以进行划分,分为全局区与静态区。全局变量与静态变量将会存放至该区域。
代码区就比较好理解了,主要是存储可执行代码,该区域的属性是只读的。###
使用代码证实内存四区的底层结构
由于栈区与堆区的底层结构比较直观的表现,在此使用代码只演示这两个概念。首先查看代码观察栈区的内存地址分配情况:
运行结果为:
我们可以观察到变量 a 的地址是 2293324 变量 b 的地址是 2293320,由于 int 的数据大小为 4 所以两者之间间隔为 4;再查看变量 c,我们发现变量 c 的地址为 2293319,与变量 b 的地址 2293324 间隔 1,因为 c 的数据类型为 char,类型大小为 1。在此我们观察发现,明明我创建变量的时候顺序是 a 到 b 再到 c,为什么它们之间的地址不是增加而是减少呢?那是因为栈区的一种数据存储结构为先进后出,如图:
首先栈的顶部为地址的“最小”索引,随后往下依次增大,但是由于堆栈的特殊存储结构,我们将变量 a 先进行存储,那么它的一个索引地址将会是最大的,随后依次减少;第二次存储的值是 b,该值的地址索引比 a 小,由于 int 的数据大小为 4,所以在 a 地址为 2293324 的基础上往上减少 4 为 2293320,在存储 c 的时候为 char,大小为 1,则地址为 2293319。由于 a、b、c 三个变量同属于一个栈内,所以它们地址的索引是连续性的。
长城汽车新能源销量及占比屡创新高
简易稳压管测试仪电路图
日本芯片发展对于我国的启示
LED瓦楞灯怎么选择
市况冷清 德州仪器半导体建厂计划延后
一文详解C语言内存管理
混合集成窄线宽半导体激光器实现220 mW功率输出
兄弟MFC-L8900CDW评测 完全可以胜任企业在办公中彩色文印的需求
腾讯火力全开布局安防产业,安防巨头盘踞市场的现象还能持续多久呢?
华硕ZenBook Flip S评测:搭载英特尔第11代Tiger Lake处理器
柔性AMOLED显示模组与PEDOT触控面板的技术整合
为了对有效载荷执行陆上回收,NASA开发出火箭全新水回收系统
苹果汽车的三相交流感应电机专利曝光
爆料,这4款芯片新品正在抢占千亿风口!
诺基亚3、诺基亚5、诺基亚6、诺基亚3310收割情怀!诺基亚7、诺基亚8来加持
安世半导体寻求筹集10亿美元贷款
DFRobot与Intel联合发布白皮书促进物联网和人工智能技术的发展及应用
将电池储能与风力发电相结合的优势与好处
挑选智能门锁,安全性最重要
天然气泄露隐患让人担心,小米米家用这个小东西可以解决