Основная проблема здесь в том, что вы пытаетесь использовать realloc с массивом, выделенным стеком. У вас есть:
ent a[mSize];
Это автоматическое распределение в стеке. Если вы захотите использовать realloc () для этого позже, вы создадите массив в куче с помощью malloc (), например:
ent *a = (ent*)malloc(mSize * sizeof(ent));
Так что библиотека malloc (и, следовательно, realloc () и т. Д.) Знает о вашем массиве. Исходя из этого, вы можете путать массивы переменной длины C99 с истинными динамическими массивами , поэтому убедитесь, что вы понимаете разницу, прежде чем пытаться это исправить.
Действительно, если вы пишете динамические массивы на C, вы должны попытаться использовать дизайн OOP-ish для инкапсуляции информации о ваших массивах и скрытия ее от пользователя. Вы хотите объединить информацию (например, указатель и размер) о вашем массиве в структуру и операции (например, распределение, добавление элементов, удаление элементов, освобождение и т. Д.) В специальные функции, которые работают с вашей структурой. Таким образом, вы можете иметь:
typedef struct dynarray {
elt *data;
int size;
} dynarray;
И вы можете определить некоторые функции для работы с dynarrays:
// malloc a dynarray and its data and returns a pointer to the dynarray
dynarray *dynarray_create();
// add an element to dynarray and adjust its size if necessary
void dynarray_add_elt(dynarray *arr, elt value);
// return a particular element in the dynarray
elt dynarray_get_elt(dynarray *arr, int index);
// free the dynarray and its data.
void dynarray_free(dynarray *arr);
Таким образом, пользователю не нужно точно помнить, как распределять объекты или какого размера массив в настоящее время. Надеюсь, что вы начали.