任何人都可以。解释以下c程序的工作原理:
具体来说,如何为(*p)() = fun
指定“乐趣”功能;我需要知道编译器如何编译这段代码。
#include<stdio.h>
int fun(); /* function prototype */
int main()
{
int (*p)() = fun;
(*p)();
return 0;
}
int fun()
{
printf("Hello World\n");
return 0;
}
答案 0 :(得分:3)
每个函数都存在于某个内存中。声明:
int (*p)() = fun;
将函数fun的内存位置分配给p。这一行:
(*p)();
正在调用p指向的内存位置中存在的函数。
Interweb充满了关于“函数指针”的信息。
答案 1 :(得分:2)
如果您查看gcc
生成的代码(-O0
):
movl $_fun, -4(%ebp)
movl -4(%ebp), %eax
call *%eax
它将fun
函数的地址存储在堆栈中的变量中,然后简单地间接调用该地址。