gpt4 book ai didi

c - 获取函数参数的地址是否合法?

转载 作者:太空狗 更新时间:2023-10-29 16:42:44 25 4
gpt4 key购买 nike

此代码片段是否在 ANSI C 中得到了明确定义?在我的系统(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

最佳答案

为了解决您的困惑:是的,参数可能由寄存器传递,但是当它成为被调用函数中的局部变量时,它就像任何其他局部变量一样。如果它的地址被获取和使用,编译器将必须确保它有一个真实的地址,通过创建一个真实的堆栈变量可以访问它。如果不是,编译器可能能够优化以将其保存在寄存器中,而无需在内存中实例化它。

关于c - 获取函数参数的地址是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3223206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com