如何打印函数的地址?
- 2024-10-24 08:50:00
- admin 原创
- 194
问题描述:
我gcc
使用以下命令编译以下示例-Wall -pedantic
:
#include <stdio.h>
int main(void)
{
printf("main: %p
", main); /* line 5 */
printf("main: %p
", (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 行的更改。
在打印函数地址时我遗漏了什么来删除警告?
解决方案 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('
');
解决方案 2:
整个想法确实是不可移植的,因为有些系统使用不同大小的指针来指向代码和数据。
您真正需要的是特定于平台的知识,即函数指针有多大,以及转换为该大小的整数类型。不幸的是,我认为没有人标准化可以容纳任何数据指针的intfuncptr_t
类似物intptr_t
。
正如 R.在他的回答中指出的那样,您始终可以将指针视为 (可能signed
或unsigned
)的数组char
,这样您就不需要任何正确大小的整数类型。
解决方案 3:
警告中就写着:ISO C 禁止将函数指针转换为对象指针类型,其中包括void*
。另请参阅此问题。
您根本无法以可移植的方式打印函数的地址,因此您无法摆脱警告。
您可以使用@R..的建议打印函数指针。
解决方案 4:
虽然将函数指针转换为 void 指针在技术上是危险的,但是将函数指针转换为 void 指针是在 POSIX 标准中使用的,因此几乎可以肯定它可以在大多数编译器上运行。
抬头dlsym()
。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD