这道笔试题之前在cu上也看到过,今天在群里又问这道题。于是就把之前在cu看到的解题方法自己实现了一遍。题目如下:

点击(此处)折叠或打开

  1. void f()
  2.   {
  3.       
  4.  
  5.    }
  6.   int main()
  7.  {
  8.      int x = 4;
  9.      int y = 5;
  10.       f();
  11.     printf("%d,%d\n",x,y);
  12.     return 0;
  13.  }
在函数f中编写代码,改变x和y的输出值。
实现代码如下

点击(此处)折叠或打开

  1. #include
  2. void f()
  3. {
  4. int a;
  5. int *p = &a;
  6. int temp1 = 0,temp2 = 0;
  7. while(!(temp1 == 4 && temp2 == ))
  8. {
  9. if(*p == 4)
  10. {
  11. temp1 = 4;
  12. *p = 7;
  13. p++;
  14. }
  15. else if(*p == 5)
  16. {
  17. temp2 = 5;
  18. *p = 8;
  19. p++;
  20. }
  21. else
  22. p++;
  23. }
  24. }
  25. int main()
  26. {
  27. int x = 4;
  28. int y = 5;
  29. printf("%p\n%p\n",&x,&y);
  30. f();
  31. printf("%d,%d\n",x,y);
  32. return 0;
  33. }
  34. ~
运行结果为:

点击(此处)折叠或打开

  1. [root@localhost ~/mylearn]# ./edit
  2. 0xbfa1a9e0
  3. 0xbfa1a9dc
  4. 7,8

主要思想为:找到f函数的栈指针,然后往回遍历栈帧,找到x和y的地址,然后就修改其值。当然,可能还有其他更好的解法,但是从这里可以看出在c中指针的灵活性。
09-15 03:07