当一个函数被调用时,它的栈帧会被创建并压入调用栈中。栈帧包含了函数的局部变量、参数以及返回地址等信息。当函数执行完毕后,栈帧会被弹出,返回到调用函数的位置继续执行。
下面是一个示例代码,展示了调用函数栈帧被修改但不影响被调用函数返回的情况:
#include <stdio.h>
void callee() {
int local_var = 10;
printf("Inside callee: local_var = %d\n", local_var);
}
void caller() {
int local_var = 5;
printf("Inside caller: local_var = %d\n", local_var);
// 修改调用函数的栈帧
*((int*)(&local_var)) = 20;
callee(); // 调用被调用函数
}
int main() {
caller(); // 调用调用函数
return 0;
}
在上述代码中,caller函数调用callee函数。在caller函数中,我们通过修改调用函数的栈帧来改变局部变量local_var的值。我们使用类型转换将local_var的地址转换为int类型的指针,并将其值修改为20。
然而,即使调用函数caller的栈帧被修改,被调用函数callee仍然能够正确返回。在callee函数中,局部变量local_var的值仍然保持为10,没有受到调用函数栈帧的修改影响。
运行结果如下图
可以看到,被调用函数callee的输出结果仍然是10,没有受到调用函数caller栈帧的修改影响。
这个示例说明了即使调用函数的栈帧被修改,被调用函数仍然能够正确返回。