如何格式化函数指针?

有什么方法可以在ANSI C中打印指向函数的指针?当然,这意味着您必须将函数指针转换为void指针,但这似乎是不可能的?


#include <stdio.h>


int main() {

    int (*funcptr)() = main;


    printf("%p\n", (void* )funcptr);

    printf("%p\n", (void* )main);


    return 0;

}

$ gcc -ansi -pedantic -Wall test.c -o test

test.c:在函数'main'中:

test.c:6:警告:ISO C禁止将函数指针转换为对象指针类型

test.c:7:警告:ISO C禁止将函数指针转换为对象指针类型

$ ./test

0x400518

0x400518


这是“有效的”,但不标准...


偶然的你
浏览 460回答 3
3回答

一只斗牛犬

唯一合法的方法是使用字符类型访问组成指针的字节。像这样:#include <stdio.h>int main() {&nbsp; &nbsp; int (*funcptr)() = main;&nbsp; &nbsp; unsigned char *p = (unsigned char *)&funcptr;&nbsp; &nbsp; size_t i;&nbsp; &nbsp; for (i = 0; i < sizeof funcptr; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; printf("%02x ", p[i]);&nbsp; &nbsp; }&nbsp; &nbsp; putchar('\n');&nbsp; &nbsp; return 0;}void *像Dreamlax的答案一样,将函数指针修饰为或任何非字符类型都是不确定的行为。组成函数指针的那些字节实际上意味着什么取决于实现。例如,它们可以仅代表函数表的索引。

九州编程

使用联合可以避免警告/错误,但是结果仍然是(最有可能)未定义的行为:#include <stdio.h>intmain (void){&nbsp; union&nbsp; {&nbsp; &nbsp; int (*funcptr) (void);&nbsp; &nbsp; void *objptr;&nbsp; } u;&nbsp; u.funcptr = main;&nbsp; printf ("%p\n", u.objptr);&nbsp; return 0;}您可以printf ("%i\n", (main == funcptr));使用if语句比较两个函数指针(例如),以测试它们是否相等(我知道这完全违反了目的,并且很可能是无关紧要的),但实际上输出了函数指针的地址,发生什么情况取决于目标平台的C库和编译器的供应商。
打开App,查看更多内容
随时随地看视频慕课网APP