C语言笔记 第三十九课 程序中的三国天下
第三十九课 程序中的三国天下
程序中的栈
栈是现代计算机程序里最为重要的概念之一
栈在程序中用于维护函数调用上下文
函数中的参数和局部变量存储在栈上
栈是一种行为,一种先进后出的行为
栈保存了一个函数调用所需的维护信息
函数调用过程
每次函数调用都对应着一个栈上的活动记录
调用函数的活动记录位于栈的中部
被调函数的活动记录位于栈的顶部
函数调用的栈变化一
从main()开始运行,esp栈顶指针
函数调用的栈变化二
当main()调用f()
函数调用的栈变化三
当从f()调用中返回main()
数据调用栈上的数据
函数调用时,对应的栈空间在函数返回前是专用的
函数调用结束后,栈空间会释放,数据不再有效
39-1 指向栈数据的指针
不要返回局部变量的地址
程序中的堆
堆是程序中一块预留的内存空间,可由程序*使用
堆中被程序申请使用的内存在被主动释放前将一直有效
为什么有了栈还需要堆?
栈上的数据在函数返回后就会被释放掉,无法传递到函数外部,如:局部数组
C语言程序中通过库函数的调用获得堆空间
头文件:malloc.h
malloc – 以字节的方式申请堆空间
free – 将堆空间归还给系统
系统对堆空间的管理方式
空闲链表法,位图法,对象池法等等
程序中的静态存储区
静态存储区随着程序的运行而分配空间
静态存储区的生命周期直到程序运行结束
在程序的编译期静态存储区的大小就已经确定
静态存储区主要用于保存全局变量和静态局部变量
静态存储区的信息最终会保存到可执行程序中
39-2 静态存储区的验证
小结
栈,堆和静态存储区是程序中的三个基本数据区
栈区只有用于函数调用的使用
堆区主要是用于内存的动态申请和归还
静态存储区用于保存全局变量和静态变量