如何打印功能的地址?如何打印功能的地址?(How to print the address of a

2019-05-12 06:38发布

我让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行。

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

Answer 1:

这主要是打印函数指针的唯一可移植的方法。

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');


Answer 2:

当一个函数指针转换为void指针在技术上是危险的,转换函数指针空指针在POSIX标准使用,所以它几乎是一定要上的大多数编译器工作。

查找dlsym()



Answer 3:

这是正确的,在该警告:ISO C不允许一个函数指针转换为一个对象的指针类型,其中包括void* 。 又见这个问题 。

你根本无法在便携方式打印函数的地址,让你无法摆脱的警告。

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



Answer 4:

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

你真正需要的是一个函数指针有多大是特定于平台的知识,并强制转换为一个整数类型的大小。 不幸的是,我不认为任何人有标准化的intfuncptr_t analagous到intptr_t它可以保存任何数据指针。


正如R.指出在他的回答 ,您可以随时处理指针数组(可能是signedunsignedchar ,这样你就不需要任何整型正确的尺寸。



文章来源: How to print the address of a function?