程序中的三国天下
程序中的栈
- 栈是现代计算机程序里面最为重要的概念之一
- 栈在程序中用于维护函数调用上下文
- 函数中的参数和局部变量存储在栈上
- 栈保存了一个函数调用所需的维护信息
- 参数
- 返回地址
- 局部变量
- 调用上下文
- ...
函数调用过程
- 每次函数调用都对应一个栈上的活动记录
- 调用函数的活动记录位于栈的中部
- 被调函数的活动记录于栈的顶部
函数调用的栈变化
从main()开始运行
当main()调用f()
当从f()调用中返回main()
返回局部变量的地址和数组是没有意义的
函数调用栈上的数据
- 函数调用时,对应的栈空间在函数返回前是专用的
- 函数调用结束后,栈空间将被释放,数据不再有效
程序中的堆
- 堆是程序中—块预留的内存空间,可由程序自由使用
- 堆中被程序申请使用的内存在被主动释放前将—直有效
为什么有了栈还需要堆?
- 栈上的数据在函数返回后就会被释放掉,
- 无法传递到函数外部,如:局部数组
- C语言程序中通过库函数的调用获得堆空间
- 头文件: malloc.h
- malloc --以字节的方式动态申请堆空间
- free --将堆空间归还给系统
系统对堆空间的管理方式
- 空闲链表法,位图法,对象池法等等
程序中的静态存储区
- 静态存储区随着程序的运行而分配空间
- 静态存储区的生命周期直到程序运行结束
- 在程序的编译期静态存储区的大小就已经确定
- 静态存储区主要用于保存全局变量和静态局部变量
- 静态存储区的信息最终会保存到可执行程序中
例子1:静态存储区的验证
#include <stdio.h>
int g_v = 1;
static int g_vs = 2;
void f()
{
static int g_vl = 3;
printf("%p\n", &g_vl);
}
int main()
{
printf("%p\n", &g_v);
printf("%p\n", &g_vs);
f();
return 0;
}
小结
- 栈,堆和静态存储区是程序中的三个基本数据区
- 栈区主要用于函数调用的使用
- 堆区主要是用于内存的动态申请和归还
- 静态存储区用于保存全局变量和静态变量