Вы не можете присвоить *fp
, потому что это выражение имеет тип функции.
fp
предназначено для хранения указателя, в данном случае указателя на функцию.Так что вам не нужно ничего выделять.Просто назначьте адрес функции:
fp f;
f = &fun;
(*f)();
Также обратите внимание, что выражение типа функции автоматически преобразуется в указатель на указанную функцию, в том числе, когда она вызывается, так что это делает то же самое:
fp f;
f = fun;
f();
РЕДАКТИРОВАТЬ:
Если вы действительно хотите динамически распределять пространство для указателя функции, то вам нужен указатель на указатель функции для его хранения:
fp *f; // fp is void (*)(), so f is void(**)()
f = malloc(sizeof(*f)); // allocate space for function pointer
*f = func;
(*f)(); // func called
free(f);
fp *g;
g = malloc(sizeof(*g)); // possibly points to what f pointed to?
*g = evil_f;
(*g)(); // evil_func called
Обратите внимание, чтовышеуказанное вызывает неопределенное поведение и будет работать только на реализациях, которые не оптимизируют значение, хранящееся в f
, и повторно используют ту же область памяти для присвоения g
.