【发布时间】:2019-08-19 04:09:47
【问题描述】:
在以下程序中,&foo、*foo 和 foo 指向同一个内存地址:
#include <stdio.h>
int foo(int arg)
{
printf("arg = %d\n", arg);
return arg;
}
int main()
{
foo(0); // ok
(*foo)(0); // ok
(&foo)(0); // ok
printf("&foo = %lx\n", (size_t)(&foo));
printf("foo = %lx\n", (size_t)(foo));
printf("*foo = %lx\n", (size_t)(*foo));
return 0;
}
输出是:
arg = 0
arg = 0
arg = 0
&foo = 55eeef54c720
foo = 55eeef54c720
*foo = 55eeef54c720
有人能解释一下吗? 谢谢。
【问题讨论】:
-
函数名(一个符号)实际上是一个内存地址。链接可执行文件时,喜欢使用内存地址更改函数名称。像
call foo这样的CPU指令是跳转到foo函数CPU机构(代码)所在的RAM块。
标签: c linux gcc function-pointers