Это критический, но простой навык, который каждый должен освоить. Основной подход состоит в том, чтобы сохранить переменную, содержащую текущее количество выделенных элементов и счетчик на используемое число. Тогда цикл заполнения вашего массива. В начале вашего цикла проверьте, if (used == allocated)
, чтобы определить, требуется ли перераспределение.
Если требуется перераспределение, с помощью указателя TEMPORARY вызовите realloc
и удвойте количество выделенных элементов. Проверьте, что realloc
успешно, в противном случае прервите цикл, заполняющий ваш массив (не выходите из программы), так как исходный указатель на ваш массив все еще указывает на действительные данные до попытки realloc
.
Если realloc
успешно назначить блок памяти нового размера исходному указателю, обновите переменную новым количеством выделенных элементов - и продолжайте, повторяя при необходимости. Пример:
#define NSTRUCT 8 /* initial number of struct to allocate for array */
...
size_t allocated = NSTRUCT, /* holds current number of elements allocated */
used = 0; /* holds current number used/filled */
struct student_grades *grades = malloc (allocated * sizeof *grades);
if (!grades) {
perror ("malloc-grades");
return 1;
}
while (/* loop to fill struct array */) {
if (used == allocated) { /* check if realloc needed */
/* always realloc using a TEMPORARY pointer */
void *tmp = realloc (grades, 2 * allocated * sizeof *grades);
if (!tmp) { /* validate reallocation */
perror ("realloc-grades");
break; /* don't exit, original pointer still good */
}
grades = tmp; /* assign reallocated block to grades */
allocated *= 2; /* update allocated size */
}
/* fill next element -- keep going.... */
used++;
}
Посмотрите вещи и дайте мне знать, если у вас все еще есть вопросы.