Đoạn mã này có được xác định rõ trong ANSI C không? Trên hệ thống của tôi (Linux x86_64) có vẻ như chỉ chạy tốt và in một địa chỉ, nhưng nó sẽ luôn luôn như vậy? Ví dụ. tham số có thể được chuyển qua một thanh ghi, và lấy địa chỉ của nó có vẻ không đúng.Có hợp pháp để lấy địa chỉ của tham số chức năng không?
#include <stdio.h>
void foo(int a)
{
printf("%p\n", &a);
}
int main(void)
{
foo(42);
return 0;
}
EDIT: Dường như GCC sẽ đặt giá trị được chuyển bằng cách đăng ký vào ngăn xếp trước khi lấy địa chỉ của nó.
<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
+1, câu trả lời của bạn hoàn chỉnh hơn :) – Stephen