Как напечатать значения указателя функции в 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
).