64.7 修改参数

有时候,C/C++程序员(虽然不仅仅是这些人)可能会问,如果他们碰巧修改了参数会怎样?答案非常简单,这些参数是保存在栈里面的,修改参数的时候是修改这个栈里面的内容,调用者并没有在被调用函数退出之后再使用它们(至少在我的实践中没有遇到这种情况)。

  1. #include <stdio.h>
  2. void f(int a, int b)
  3. {
  4. a=a+b;
  5. printf ("%d\n", a);
  6. };

Listing 64.9: MSVC 2012

  1. _a$ = 8 ; size = 4
  2. _b$ = 12 ; size = 4
  3. _f PROC
  4. push ebp
  5. mov ebp, esp
  6. mov eax, DWORD PTR _a$[ebp]
  7. add eax, DWORD PTR _b$[ebp]
  8. mov DWORD PTR _a$[ebp], eax
  9. mov ecx, DWORD PTR _a$[ebp]
  10. push ecx
  11. push OFFSET $SG2938 ; '%d', 0aH
  12. call _printf
  13. add esp, 8
  14. pop ebp
  15. ret 0
  16. _f END

是的,可以随便修改参数。当然,这得它不是C++的引用(references)(51.3),而且你如果不修改通过指针指向的数据。那么修改参数是不会影响到当前函数的。

从理论上来讲,被调用者的函数返回之后,调用者可以获取并修改和使用它。如果它是直接使用汇编语言编写的。但C/C++并不提供任何方式可以访问它们。