C函数如何不通过传参修改外部变量
本文介绍了C函数如何不通过传参修改外部变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
void fun_a(void) {
....
}
int main() {
int x = 5, y = 6;
fun_a();
printf("%d, %d", x, y);
return 0;
}
请问 fun_a 函数内部如何实现能够改变程序输入不为5,6?[一道笔试题,考虑了很久,感觉可以通过指针hack外部变量,但是没有进一步思路]
解决方案
看上图,这是linux下的进程内存空间布局图,是32位的,64位也差不多,地址不一样而已。
首先要明确一点,就是函数的调用是栈式的,而栈空间的地址是向下的,也就是后入栈的内存地址反而小。并且入栈的地址是对齐的。(这不是绝对的。不同的体系结构下可能是完全不同的)
在main
函数里面先入栈了y
,然后入栈了x
,再入栈函数func_a
出入栈顺序
入main
入main的返回值
(因为main没有参数,所以此处不需要入参)
入y,x (int宽度对齐)
入func_a (指针宽度对齐)
(func_a没有参数也没有返回值)
这里要在func_a
里面修改x/y
,就需要得到它们的地址,可以使用以下方式来达到目的。
struct offset{
void(*pf2)(); // main
int ret; // main的返回值
int x,y; // x,y占位
int(*pf1)(); // 表示func_a
};
void fun_a(void) {
int a;
// 此处需要注意结构体对齐
int* py = (int*)((char*)&a + sizeof(offset)+sizeof(void*));
//|<-这部分获取到入栈的main->|
int* px = py-1;
printf("x = %d\ny = %d\n",*px,*py);
}
这篇关于C函数如何不通过传参修改外部变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文