很多人写C很久,却只知道“函数调用”,不知道函数是怎么被调用、怎么返回、局部变量存在哪。本质就一件事:栈帧(Stack Frame)。
一、什么是栈帧
每调用一次函数,CPU 都会在栈上开辟一块空间,用来保存:
- 函数的返回地址
- 函数参数
- 局部变量
- 上一层栈帧的位置
这一块就叫栈帧。
函数进:压栈,新建栈帧。
函数退:弹栈,销毁栈帧。
调用越深,栈用得越多。
二、底层逻辑(一句话)
调用函数 = 压栈 + 跳过去执行
返回 = 恢复栈帧 + 跳回原来位置
所以:
- 局部变量快,是因为直接在栈上。
- 递归太深会崩,是因为栈溢出。
- 函数不能返回局部变量指针,是因为栈帧销毁,地址失效。
三、最经典的坑
int *func() {
int a = 10;
return &a;
}
a 在栈帧里。
函数一返回,栈帧作废,指针变成野指针。
这就是为什么不要返回局部变量地址。
四、总结
- 栈帧 = 函数的临时运行现场。
- 函数调用 = 栈帧的创建与销毁。
- 理解栈帧,你才算真正懂:局部变量、递归、函数返回、野指针。