代码之家  ›  专栏  ›  技术社区  ›  Maister

获取函数参数的地址合法吗?

  •  9
  • Maister  · 技术社区  · 14 年前

    #include <stdio.h>
    
    void foo(int a)
    {
       printf("%p\n", &a);
    }
    
    int main(void)
    {
       foo(42);
       return 0;
    }
    

    EDIT:看起来GCC会先将寄存器传递的值放入堆栈,然后再获取它的地址。

    <foo>:
      55                      push   rbp
      48 89 e5                mov    rbp,rsp
      48 83 ec 10             sub    rsp,0x10
      89 7d fc                mov    DWORD PTR [rbp-0x4],edi
      b8 1c 06 40 00          mov    eax,0x40061c
      48 8d 55 fc             lea    rdx,[rbp-0x4]
      48 89 d6                mov    rsi,rdx
      48 89 c7                mov    rdi,rax
      b8 00 00 00 00          mov    eax,0x0
      e8 d8 fe ff ff          call   4003c0 <printf@plt>
      c9                      leave  
      c3                      ret   
    
    3 回复  |  直到 14 年前
        1
  •  9
  •   Stephen    14 年前

    是的,这是完全合法的-当然你不会从函数返回那个地址,因为到那时 foo 回报,毫无意义。

        2
  •  18
  •   R.. GitHub STOP HELPING ICE    14 年前

    解决你的困惑:是的,论点可能是 通过

        3
  •  1
  •   Carl Smotricz    14 年前

    完全合法。但是你需要考虑一下你得到地址的范围和生命周期。

    如果您设法将其传回函数,则该地址可能不再指向有效数据。在C语言中,这可以让你射中自己的脚。