如何在C语言中打印函数指针的值?

3
我有一个指向返回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禁止将函数指针转换为对象指针类型”错误,要么出现一些未定义的行为。

编辑:

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

不正确。


将函数指针转换为字符指针,对其进行解引用,并使用无符号字符 *。 - Dimitar
1
在Linux上,您可以考虑使用 dladdr 函数来获取全局函数的名称,只需给出其地址即可。 - Basile Starynkevitch
1个回答

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

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

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

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

这是打印字符串的方法。没有标准的格式说明符可以打印函数指针。 %p 仅用于数据指针,而不适用于函数指针。因此,如果使用 %p 打印函数指针,则会产生未定义的行为
如果您确实需要打印函数指针,请将其转换为字符指针并进行打印。
   unsigned char *cp = (unsigned char*)&fp;

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

这个方法可行是因为将任何对象转换为字符指针都是被允许的(char*unsigned char*或者signed char*)。它打印出来的格式由实现定义(就像%p一样)。

这个“然后将其转换为字符指针”是误导性的,因为您的代码执行了不同的操作。 - alk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接