如何格式化函数指针?

问题描述 投票:45回答:6

有没有办法在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.c:功能正常 'main':test.c:6:警告:ISO C 禁止转换函数指针 对象指针类型test.c:7: 警告:ISO C禁止转换 指向对象指针的函数指针 键入$ ./test 0x400518 0x400518

这是“有效”,但非标准...

c function-pointers
6个回答
45
投票

唯一合法的方法是使用字符类型访问组成指针的字节。像这样:


5
投票
使用联合可以避免警告/错误,但是结果仍然是(很可能是)未定义的行为:

2
投票
将函数指针转换为整数,然后再次将其转换为指针以使用“%p”。

2
投票
尝试一下:

1
投票
对于gcc 4.3.4,使用-O2 -Wstrict锯齿开关,dreamlax的答案将产生:

0
投票
我不确定这是否是洁净的,但它会达到没有循环,并集,强制转换为非指针类型或除string.h以外的额外依赖关系的效果>

int (*funcptr)() = main; void* p = NULL; memcpy(&p, (void**) &funcptr, sizeof(funcptr)); printf("%p", p);

© www.soinside.com 2019 - 2024. All rights reserved.