本文介绍C语言中的程序栈。
程序栈是支持函数执行的内存区域,通常和堆共享。
也就是说,它们共享同一块内存区域。程序栈通常占据这块区域的下部,而堆用的则是上部。
程序栈存放栈帧(stack frame),栈帧有时候也称为活跃记录(activation record)或活跃帧(activation frame)。
栈帧存放函数参数和局部变量。堆管理动态内存,已经在2.2.1节中讨论过了。
下图从原理上说明了栈和堆的结构。这个说明基于以下代码片段。
void function2() {
Object *var1 = ...;
int var2;
printf("Program Stack Example\n");
}
void function1() {
Object *var3 = ...;
function2();
}
int main() {
int var4;
function1();
}
调用函数时,函数的栈帧被推到栈上,栈向上“长出”一个栈帧。当函数终止时,其栈帧从程序栈上弹出。栈帧所使用的内存不会被清理,但最终可能会被推到程序栈上的另一个栈帧覆盖。
动态分配的内存来自堆,堆向下“生长”。随着内存的分配和释放,堆中会布满碎片。尽管堆是向下生长的,但这只是个大体方向,实际上内存可能在堆上的任意位置分配。