【问题标题】:How to print values of function pointer in C? [duplicate]如何在C中打印函数指针的值? [复制]
【发布时间】:2015-12-13 12:16:12
【问题描述】:

我有一个指向返回 const char 指针的函数的指针。我的问题是如何打印指针以及指针引用的对象(字符串本身)。

代码如下:

#include <stdio.h>

char const *func(void)
{
    printf("Printed func string.\n");
    return "Pointed func string.\n";
}

int main(void) {
    char const *(*fp)(void) = func;

    /*print statements here*/

    return 0;
}

我收到ISO C forbids conversion of function pointer to object pointer type 或一些未定义的行为。

编辑:

int main(void) {
    char const *(*fp)(void) = func;

    unsigned char *p = (unsigned char *)&fp;
    /*print statements here*/
    printf("The: %p\n",(char *) p);


    return 0;
}

输出:0x7fff36753500

不正确。

【问题讨论】:

  • 将函数指针转换为 char 指针,取消引用,使用 unsigned char *.
  • 在 Linux 上,您可能会考虑使用dladdr 来获取名称,给定 global 函数的地址

标签: c function pointers function-pointers


【解决方案1】:
char const *(*fp)(void) = func;

在这里,您只是将func 分配给函数指针。你需要调用它来获取函数返回的字符串。

   char const *(*fp)(void) = func;

   const char *p = fp();
   printf("In main: %s", p);

这就是你打印字符串的方式。没有标准的格式说明符来打印函数指针。 %p 仅适用于数据指针,不适用于函数指针。所以使用%p打印函数指针是undefined behaviour

如果确实需要打印函数指针,则将其转换为字符指针并打印:

   unsigned char *cp = (unsigned char*)&fp;

   for(i=0;i<sizeof fp; i++) {
      printf("[%08x]", cp[i]);
   }

这是可行的,因为允许将任何对象转换为字符指针(char*unsigned char*signed char*)。它打印的是实现定义的格式(就像%p)。

【讨论】:

  • 这个“然后将其转换为字符指针”具有误导性。因为你的代码做了一些不同的事情。
猜你喜欢
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2011-01-29
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多