C语言函数调用栈可视化

深入理解函数调用、栈帧创建和内存管理

C语言代码

#include <stdio.h>
int factorial(int n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
int sum(int a, int b) {
int result = a + b;
return result;
}
int main() {
int x = 5;
int y = factorial(3);
int z = sum(x, y);
printf("结果: %d\n", z);
return 0;
}

这是一个包含多个函数调用的C程序示例。观察函数调用时栈帧的创建和销毁过程。

函数调用栈

内存布局

栈 (Stack)
0x7ffd42a1b5a0 main() 返回地址
0x7ffd42a1b598 main() 栈帧基址
堆 (Heap)
0x55a1b4e2b6b0 动态分配内存
数据段 (Data Segment)
0x55a1b4e2a010 全局变量
代码段 (Text Segment)
0x55a1b4e2a000 程序指令

函数调用栈详解

程序开始执行,main()函数被调用,创建第一个栈帧。

栈帧 (Stack Frame)

每个函数调用时在栈上分配的内存区域,包含返回地址、参数、局部变量等。

基址指针 (BP)

指向当前栈帧开始位置的指针,用于访问参数和局部变量。

栈指针 (SP)

指向栈顶位置的指针,随着数据入栈和出栈而移动。

调用约定

规定参数传递、寄存器使用和栈清理的规则,如cdecl、stdcall等。

C语言栈相关学习资源