Для случая, когда ваш указатель на функцию 'fp' имеет тип, который не принимает аргументов и возвращает void, в этом случае вы должны объявить его как:
typedef void (*fp)();
В указанном выше случае звонок должен быть:
(*gen)();
Если ваш указатель на функцию 'fp' имеет тип, который принимает 'void *' в качестве аргумента и возвращает void, в этом случае вы должны объявить его как:
typedef void (*fp)(void *);
В приведенном выше случае вызов должен быть:
(*gen)(NULL);
или любая другая переменная-указатель, которую вы можете передать.
Что касается вашего примера, попробуйте следующее:
typedef void * (*fp)(void *);
void* gen_array(fp gen, size_t size) {
int i, len = gen_int() % 100;
void* arr = GC_MALLOC(len * size);
for (i = 0; i < len; i++) {
arr[i] = (*gen)(NULL);
}
return arr;
}