这道笔试题之前在cu上也看到过,今天在群里又问这道题。于是就把之前在cu看到的解题方法自己实现了一遍。题目如下:
- void f()
- {
-
-
- }
- int main()
- {
- int x = 4;
- int y = 5;
- f();
- printf("%d,%d\n",x,y);
- return 0;
- }
在函数f中编写代码,改变x和y的输出值。
实现代码如下
- #include
-
- void f()
- {
- int a;
- int *p = &a;
- int temp1 = 0,temp2 = 0;
- while(!(temp1 == 4 && temp2 == ))
- {
- if(*p == 4)
- {
- temp1 = 4;
- *p = 7;
- p++;
- }
- else if(*p == 5)
- {
- temp2 = 5;
- *p = 8;
- p++;
- }
- else
- p++;
- }
-
- }
- int main()
- {
- int x = 4;
- int y = 5;
- printf("%p\n%p\n",&x,&y);
- f();
- printf("%d,%d\n",x,y);
- return 0;
- }
- ~
运行结果为:
- [root@localhost ~/mylearn]# ./edit
- 0xbfa1a9e0
- 0xbfa1a9dc
- 7,8
主要思想为:找到f函数的栈指针,然后往回遍历栈帧,找到x和y的地址,然后就修改其值。当然,可能还有其他更好的解法,但是从这里可以看出在c中指针的灵活性。
阅读(2127) | 评论(0) | 转发(1) |