Как напечатать значения указателя функции в C?

У меня есть указатель на функцию, возвращающую указатель на константный символ. Мой вопрос заключается в том, как напечатать указатель, а затем также объект (сама строка), на который ссылаются указатель (и).

Вот код:

#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

Не является правильным.

1 ответ

Решение
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).

Другие вопросы по тегам