2010-07-11 20 views
9

此代码片段在ANSI C中有很好的定义吗? 在我的系统(Linux x86_64)上它似乎运行得很好并且打印出一个地址,但它会一直如此吗?例如。该参数可能通过寄存器传递,并且认为这个地址看起来不正确。采用函数参数的地址是否合法?

#include <stdio.h> 

void foo(int a) 
{ 
    printf("%p\n", &a); 
} 

int main(void) 
{ 
    foo(42); 
    return 0; 
} 

编辑:看起来像海湾合作委员会将把寄存器传递到堆栈之前的价值取得它的地址。

<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 <[email protected]> 
    c9      leave 
    c3      ret 

回答

8

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

1

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

如果您试图将其从功能中传回,那么该地址可能不再指向有效数据。就像C中的大部分一样,这让你有能力在脚下自我射击。

16

为了解决您的疑惑:是的,参数可能是通过通过一个寄存器,但是当它成为被调用函数中的局部变量时,就像任何其他局部变量一样。如果地址被使用,编译器将不得不确保它有一个真实的地址,通过它可以通过创建一个真正的堆栈变量来访问它。如果没有,编译器可能能够优化以将其保存在寄存器中,而不用在存储器中实例化它。

+2

+1,你的回答比较完整:) – Stephen 2010-07-11 14:43:08

相关问题