C语言笔记 第三十九课 程序中的三国天下

第三十九课 程序中的三国天下

程序中的栈

栈是现代计算机程序里最为重要的概念之一
栈在程序中用于维护函数调用上下文
函数中的参数和局部变量存储在栈上
C语言笔记 第三十九课 程序中的三国天下
栈是一种行为,一种先进后出的行为
栈保存了一个函数调用所需的维护信息
C语言笔记 第三十九课 程序中的三国天下

函数调用过程

每次函数调用都对应着一个栈上的活动记录
调用函数的活动记录位于栈的中部
被调函数的活动记录位于栈的顶部
C语言笔记 第三十九课 程序中的三国天下

函数调用的栈变化一

从main()开始运行,esp栈顶指针
C语言笔记 第三十九课 程序中的三国天下

函数调用的栈变化二

当main()调用f()
C语言笔记 第三十九课 程序中的三国天下

函数调用的栈变化三

当从f()调用中返回main()
C语言笔记 第三十九课 程序中的三国天下

数据调用栈上的数据

函数调用时,对应的栈空间在函数返回前是专用的
函数调用结束后,栈空间会释放,数据不再有效
C语言笔记 第三十九课 程序中的三国天下
39-1 指向栈数据的指针
不要返回局部变量的地址

程序中的堆

堆是程序中一块预留的内存空间,可由程序*使用
堆中被程序申请使用的内存在被主动释放前将一直有效
为什么有了栈还需要堆?
栈上的数据在函数返回后就会被释放掉,无法传递到函数外部,如:局部数组
C语言程序中通过库函数的调用获得堆空间
头文件:malloc.h
malloc – 以字节的方式申请堆空间
free – 将堆空间归还给系统
系统对堆空间的管理方式
空闲链表法,位图法,对象池法等等
C语言笔记 第三十九课 程序中的三国天下

程序中的静态存储区

静态存储区随着程序的运行而分配空间
静态存储区的生命周期直到程序运行结束
在程序的编译期静态存储区的大小就已经确定
静态存储区主要用于保存全局变量和静态局部变量
静态存储区的信息最终会保存到可执行程序中
39-2 静态存储区的验证
小结
栈,堆和静态存储区是程序中的三个基本数据区
栈区只有用于函数调用的使用
堆区主要是用于内存的动态申请和归还
静态存储区用于保存全局变量和静态变量