如何打印一个函数的地址?

我让gcc使用-Wall -pedantic来编译下面的例子:

 #include <stdio.h> int main(void) { printf("main: %p\n", main); /* line 5 */ printf("main: %p\n", (void*) main); /* line 6 */ return 0; } 

我得到:

 main.c:5: warning: format '%p' expects type 'void *', but argument 2 has type 'int (*)()' main.c:6: warning: ISO C forbids conversion of function pointer to object pointer type 

第5行使我的更改像第6行一样。

打印函数地址时,我错过了什么来消除警告?

Solutions Collecting From Web of "如何打印一个函数的地址?"

这实际上是打印函数指针的唯一便携式方法。

 size_t i; int (*ptr_to_main)() = main; for (i=0; i<sizeof ptr_to_main; i++) printf("%.2x", ((unsigned char *)&ptr_to_main)[i]); putchar('\n'); 

将函数指针转换为void指针在技术上是危险的,因此在POSIX标准中使用将指针转换为void指针的方式,所以在大多数编译器中几乎可以工作。

查找dlsym()

正是在这个警告中:ISO C禁止将函数指针转换为包含void*的对象指针类型。 另见这个问题 。

你不能以便携的方式打印一个功能的地址,所以你不能摆脱这个警告。

你可以使用@R ..的建议来打印一个函数指针。

这个想法实际上是不可移植的,因为有些系统使用不同大小的指针来代码和数据。

你真正需要的是关于函数指针有多大的特定于平台的知识,以及一个强制类型的转换。 不幸的是,我不认为任何人已经标准化intptr_t intfuncptr_tintptr_t可以容纳任何数据指针。


正如R. 在他的回答中所指出的那样 ,你总是可以把指针当作一个(可能是有signedunsignedchar的数组,这样你就不需要任何正确大小的整数类型。