C函数如何不通过传参修改外部变量

查看:112
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆