在C语言中通过函数指针调用函数时是否会生成独立栈帧?
函数指针调用的栈帧问题解答
结论
通过指向代码段函数的函数指针调用目标函数时,被调用函数会拥有属于自己的独立栈帧,和直接调用函数的行为完全一致。
原理说明
- 栈帧的分配规则由平台的ABI(应用二进制接口)和语言的调用约定决定,和调用函数的方式没有关联。只要触发标准的函数调用流程,CPU就会自动完成旧栈基址保存、返回地址入栈、为当前函数预留栈空间等操作,生成独立的栈帧。
- 函数指针的本质是存储了目标函数在代码段的入口内存地址,作用仅为给CPU指定跳转执行的目标位置,不会修改后续函数调用的栈操作逻辑。
示例验证
可以通过以下C语言代码验证该结论:
#include <stdio.h> void test_func(int val) { int local_var = val * 2; printf("本次调用中局部变量的地址为:%p\n", &local_var); } int main() { void (*func_p)(int) = test_func; printf("直接调用test_func:\n"); test_func(10); printf("函数指针调用test_func:\n"); func_p(10); return 0; }
运行后可以看到两次调用中局部变量local_var的地址都属于独立的栈空间,不存在复用冲突的情况。
特殊说明:如果是手动编写汇编修改栈指针、或者自定义非标准调用约定的场景下可能出现例外,这类情况属于人为修改调用规则,和函数指针的调用逻辑无关。
内容的提问来源于stack exchange,提问作者Vinayak Kushwaha
相关产品推荐
相关产品推荐

