这个代码片段在ANSI C中是否定义良好?
在我的系统( Linux x86_64)上,它似乎运行正常,并打印一个地址,但会一直是这样吗?例如.该参数可以通过寄存器传递,并且取其地址似乎不正确.
在我的系统( Linux x86_64)上,它似乎运行正常,并打印一个地址,但会一直是这样吗?例如.该参数可以通过寄存器传递,并且取其地址似乎不正确.
#include <stdio.h> void foo(int a) { printf("%p\n",&a); } int main(void) { foo(42); return 0; }
编辑:看起来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
解决方法
是的,这是完全合法的 – 当然你不会从函数中返回该地址,因为在foo返回的时候,它是没有意义的.