如何打印功能的地址?

alk*_*alk 16 c linux gcc function-pointers gcc-warning

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;
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

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
Run Code Online (Sandbox Code Playgroud)

第5行让我更改了第6行中的代码.

在打印功能的地址时删除警告我错过了什么?

R..*_*R.. 16

这实际上是打印函数指针的唯一可移植方式.

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');
Run Code Online (Sandbox Code Playgroud)

  • 根据C标准定义任意两个函数指针之间的转换并保持往返值保持; 见6.3.2.3的结尾. (3认同)
  • 我喜欢这个,虽然它默默地忽略任何字节序问题...... ;-) (2认同)

Ben*_*igt 5

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

您真正需要的是特定于平台的关于函数指针有多大的知识,以及转换为该大小的整数类型。不幸的是,我认为没有人标准化了可以保存任何数据指针的intfuncptr_t类似物intptr_t


正如 R.在他的回答中指出的那样,您始终可以将指针视为 (可能signedunsigned)的数组char,这样您就不需要任何正确大小的整数类型。


Fre*_*Foo 5

它就在警告中:ISO C 禁止将函数指针转换为对象指针类型,其中包括void*. 另请参阅此问题

您根本无法以可移植的方式打印函数的地址,因此您无法摆脱警告。

您可以使用@R.. 的建议打印函数指针。

  • 对于 POSIX,所有指针的表示都是相同的,因此在 POSIX 系统上,您可以将“memcpy”从函数指针变量转换为数据指针变量,然后打印出来。当然,您可以*总是* 逐字节打印任何类型的表示,而无需 POSIX 依赖性。 (2认同)