C语言程序栈

本文介绍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();
}

栈和堆

调用函数时,函数的栈帧被推到栈上,栈向上“长出”一个栈帧。当函数终止时,其栈帧从程序栈上弹出。栈帧所使用的内存不会被清理,但最终可能会被推到程序栈上的另一个栈帧覆盖。

动态分配的内存来自堆,堆向下“生长”。随着内存的分配和释放,堆中会布满碎片。尽管堆是向下生长的,但这只是个大体方向,实际上内存可能在堆上的任意位置分配。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程