Вы можете использовать calloc(N,SIZE) выделить массив N число элементов каждого с размером SIZE.
В вашем случае это будет выглядеть следующим образом:
базы данных * записи = calloc (numdatabases, SizeOf (* записей));
Что касается изменения размера массива, вы можете использовать realloc(PTR,SIZE), который будет иметь размер ранее выделенного пространства, на который указывает PTR, до размера SIZE.
В вашем случае вы можете сжать массив так:
database *shrinkedrecords = realloc(records,NEWNUMBEROFARRAYS * sizeof(*records))
Кстати в обоих кодов вместо того, чтобы SizeOf (* записей) можно положить SizeOf (база данных) и являются действительными.
Вы отметили это с помощью 'malloc()'. Так? (О, и у нас есть VLA в C99 в любом случае.) –