微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

取一个函数参数的地址是合法的吗?

这个代码片段在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

解决方法

是的,这是完全合法的 – 当然你不会从函数中返回该地址,因为在foo返回的时候,它是没有意义的.

原文地址:https://www.jb51.cc/c/112416.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐