为了账号安全,请及时绑定邮箱和手机立即绑定

如何格式化函数指针?

如何格式化函数指针?

C
偶然的你 2019-11-18 14:14:29
有什么方法可以在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 testtest.c:在函数'main'中:test.c:6:警告:ISO C禁止将函数指针转换为对象指针类型test.c:7:警告:ISO C禁止将函数指针转换为对象指针类型$ ./test0x4005180x400518这是“有效的”,但不标准...
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

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


#include <stdio.h>


int main() {

    int (*funcptr)() = main;

    unsigned char *p = (unsigned char *)&funcptr;

    size_t i;


    for (i = 0; i < sizeof funcptr; i++)

    {

        printf("%02x ", p[i]);

    }

    putchar('\n');


    return 0;

}

void *像Dreamlax的答案一样,将函数指针修饰为或任何非字符类型都是不确定的行为。


组成函数指针的那些字节实际上意味着什么取决于实现。例如,它们可以仅代表函数表的索引。


查看完整回答
反对 回复 2019-11-18
?
九州编程

TA贡献1785条经验 获得超4个赞

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


#include <stdio.h>


int

main (void)

{

  union

  {

    int (*funcptr) (void);

    void *objptr;

  } u;

  u.funcptr = main;


  printf ("%p\n", u.objptr);


  return 0;

}

您可以printf ("%i\n", (main == funcptr));使用if语句比较两个函数指针(例如),以测试它们是否相等(我知道这完全违反了目的,并且很可能是无关紧要的),但实际上输出了函数指针的地址,发生什么情况取决于目标平台的C库和编译器的供应商。


查看完整回答
反对 回复 2019-11-18
  • 3 回答
  • 0 关注
  • 459 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信