![bc45e54737d6942745d0b280adb73fcd.png](https://img-blog.csdnimg.cn/img_convert/bc45e54737d6942745d0b280adb73fcd.png)
谈论下计算机里面的存储器有哪些?
程序中的栈---可以说,没有栈,程序几乎无法运行
1.栈是现代计算机程序中最为重要的概念之一
2.栈在程序中用于维护函数调用上下文
3.函数中的参数和局部变量也存在栈上 (返回地址,寄存器信息等)
栈是一种行为---后进先出
程序中的栈
栈保存了一个函数调用的所需的维护信息
---参数
---返回地址
---局部变量
---调用上下文
---。。。
函数的调用过程
1.每次函数调用都对应这一个栈上的活动记录
---调用函数的活动记录位于栈的中部
---被调用的函数的活动记录位于栈的顶部
函数调用的栈变化1
从main()开始运行
![612e52480913b601ea3cabdf1bd61180.png](https://img-blog.csdnimg.cn/img_convert/612e52480913b601ea3cabdf1bd61180.png)
当main调用f()
![d2bea05259d8b60309ce9f8e522039cc.png](https://img-blog.csdnimg.cn/img_convert/d2bea05259d8b60309ce9f8e522039cc.png)
从f()再回main --- 这就是之前为什么说不要返回局部变量的内存地址
![f797a1a0bbb6fc63f7c9ebbdd17f742c.png](https://img-blog.csdnimg.cn/img_convert/f797a1a0bbb6fc63f7c9ebbdd17f742c.png)
函数调用栈上的数据
1.函数调用时,对应的栈空间在函数返回前是专用的
2.函数调用结束后,栈空间将被释放,数据不再有效
![eed0b621ea9fb9fdb887d17b0e186319.png](https://img-blog.csdnimg.cn/img_convert/eed0b621ea9fb9fdb887d17b0e186319.png)
实验1:指向栈数据的指针
#
程序中的堆(malloc)
1.堆是程序中的一块预留的内存空间,可由程序员自由使用
2.堆中被程序申请使用的内存在被主动释放前将一直有效
为什么有了栈还需要堆?
1.栈上的数据在函数返回后 就会被释放
2.无法传递函数外部,如:局部变量
C语言程序中通过库函数的调用获得堆空间
---头文件 malloc.h
---malloc -- 一字节的方式申请堆空间
---free ---将堆空间归还给系统
引出一个有趣的点:系统对堆空间的管理方式
---空闲链表法,位图法,对象池法等
会有限找最接近的大小!!!
![bc73bb18a54d668e12cea5c28233f1d7.png](https://img-blog.csdnimg.cn/img_convert/bc73bb18a54d668e12cea5c28233f1d7.png)
第三个区
程序中的静态存储区
1.静态存储区随着程序的运行而分配空间
2.静态存储区的生命周期直到程序运行结束
3.在程序的编译期静态存储区的大小就已经确定
4.静态存储区主要是用于保存全局变量和静态局部变量
5.静态存储区的信息最终会保存在可执行程序中
实验2:静态存储区的验证
#include
小结:
栈,堆 , 静态存储区 是程序中的基本数据区
1.栈主要是函数调用使用
2.堆主要是用于内存的动态申请和归还
3.静态存储区是保存全局变量和静态变量
说明
1.该文档仅供个人学习使用,版权所有,禁止商用。
2.本文由我一个人编辑并整理,难免存在一些错误。
3.为了方便大家平时公交、地铁、外出办事也能用手机随时随地查看该教程,该教程同步更新于微信公众号『Allen5G』。
我的微信公众号(ID:Allen5G)主要分享软件工程师进阶(嵌入式,Linux,C/C++,python,英语),程序员职业发展,如果想查看更多内容,可以关注我的微信公众号『Allen5G』