В соответствии со стандартом C, void не имеет размера - sizeof (void) не определен.(Некоторые реализации делают это sizeof (int), но это несовместимо.)
Если у вас есть массив типа foo, это выражение:
array[3]
Добавляет 3 * sizeof (foo) по адресу, хранящемуся в массиве, а затем задерживает это.Это потому, что все значения упакованы в памяти.Поскольку sizeof (void) не определен, вы не можете сделать это для пустых массивов (на самом деле вы не можете даже иметь пустые массивы, только пустые указатели.)
Вы должны разыграть любоеvoid указатель на другой тип указателя перед обработкой его как массива:
d->things = malloc(20 * sizeof(int));
(int *)(d->things)[0] = 12;
Однако имейте в виду, что вам даже не нужно это делать, чтобы использовать strncpy для него.Strncpy может принимать указатель void просто отлично.Но вы использовали strncpy неправильно.Ваш вызов strncpy должен выглядеть следующим образом:
strncpy(d->things, thing, d->sizeOfThings);
Ваша версия сделала бы попытку обработать первый член массива d-> вещей как указатель, когда это не так, и обработал бы & вещь, котораяэто символ **, как если бы это был просто символ *.