程序中的栈
栈是现代计算机程序中最重要的概念之一
栈在程序中用于维护函数调用上下文
函数中的参数和局部变量存储在栈上
栈保留了一个函数调用所需的维护信息
参数
返回地址
局部变量
调用上下文
- …
函数调用过程
每次函数调用都对应着一个栈上的活动记录
调用函数的活动记录位于栈的中部
被调函数的活动记录位于栈的顶部
函数调用时,对应的栈空间在函数返回前是专用的
函数调用结束后,栈空间将被释放,数据不再有效
程序中的堆
堆是程序中一块预留的内存空间,可由程序自由使用
堆中被程序申请使用的内存在被主动释放前一直有效
问:
为什么有了栈还需要堆
答:
栈上的数据在函数返回后就会被释放掉,无法传递到函数外部
而堆空间在主动释放前一直有效
C语言程序通过库函数的调用获得堆空间
头文件:malloc.h
malloc函数 ==> 以字节的方式动态申请堆空间
free函数 == > 将堆空间归还给系统
程序的静态存储空间
静态存储区随着程序的运行而分配空间
静态存储区的生命周期直到程序运行结束
在程序的编译期静态存储区的大小就已经确定
静态存储区主要用来保存全局变量和静态局部变量
静态存储区的信息最终会保存到可执行程序中
/*
测试代码
静态存储区的验证
*/
#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;
}
运行结果
00402000
00402004
00402008