Я тестирую программу для понимания функций обратного вызова и указателей функций. Программа приведена ниже.Назначение функции указателям на функции
Мой вопрос при назначении
cb_display = (void*)display_struct;
Я должен бросить функцию к void*
. Почему это требуется, даже если возвращаемый тип функции недействителен?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int a;
char b[16];
}myst_t;
void (*cb_display)(void*);
void display_struct(myst_t *st){
fprintf(stdout, "a -> %d b -> %s \n",st->a,st->b);
}
int main()
{
myst_t myst;
myst.a = 789432;
strncpy(myst.b,"helloabcd",9);
cb_display = (void*)display_struct;
cb_display(&myst);
return 0;
}
Листинг вызывает неопределенное поведение. 'void *' может быть преобразован только в/из указателя _object_, а не указателя функции. Если вы сделаете это правильно, вам также не нужно делать бросок. Получите ваши типы правильно! – Olaf
Типы возвращаемого типа совпадают, однако типы аргументов различаются ('void *' vs. 'myst_t *'). – cremno