Нет, это невозможно (я предполагаю, что вы на самом деле имели в виду следующее, поскольку ваш код не имеет особого смысла)
((void **)&mem->ptr1)[0]=fun1;
((void **)&mem->ptr1)[1]=fun1;
Это синтаксически правильно, но цитируем стандарт C:
В объекте структуры может быть безымянный отступ, но не в его начале.
, что означает, что вам не гарантируется, что ((void **)&mem->ptr1)+1 == ((void **)&mem->ptr2)
.
Выписанное вами заявление
(void **)mem->ptr1[0] = fun1;
фактически означает
(void **)((mem->ptr1)[0]) = fun1;
, который пытается индексировать указатель на функцию.
Обратите внимание, что все ссылки, такие как mem->ptr1
и т. д., должны действительнобыть mem->x.ptr1
в соответствии с вашими определениями.