Рекурсивная функция realloc () выбрасывает «неверный следующий размер» после 7-го цикла - PullRequest
0 голосов
/ 16 января 2019

Итак, у меня есть указатель, который должен увеличивать его «длину», пока пользователь не введет отрицательное число или «е».Он начинается с длины «1», через malloc(), затем я использую в цикле do{...} while(...) функцию realloc(), чтобы увеличить его длину.Вот код:

int *array = malloc (sizeof(int) * 1);
bool exit = false;
int lastIndex = 0, value;

do {
    printf ("Insert a positive number. Insert a negative number or \"e\" to exit:  ");

    int scanf_result = scanf("%i", &value);
    if (scanf_result) {
      if (value >= 0) {
        array[lastIndex] = value;
        lastIndex++;
        array = (int*) realloc (array, lastIndex * sizeof(int));
      } else {
        exit = true;
      }
    } else {
      exit = true;
    }
} while (!exit);

Я не могу понять, почему после 7-го цикла он выходит с ошибкой realloc(): invalid next size.

Есть идеи?Спасибо в совете за помощь.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы не перераспределяете достаточно памяти:

array = (int*) realloc (array, lastIndex * sizeof(int));

На первой итерации цикла lastIndex увеличивается с 0 до 1, затем вы запускаете вышеуказанный вызов realloc. Поскольку lastIndex равно 1, у вас все еще достаточно места для 1 элемента. В результате вы пишете после окончания выделенной памяти на следующей итерации.

Это вызывает неопределенное поведение , которое в вашем случае проявляется в том, что оно работает должным образом в течение первых 6 итераций и не работает 7-го. Он мог так же легко разбиться на первой или второй итерации.

Добавьте единицу к размеру, который вы выделяете:

array = realloc(array, (lastIndex + 1) * sizeof(int));

Кроме того, не приводит к возвращаемому значению malloc / realloc.

0 голосов
/ 16 января 2019

Исправь свой realloc:

array = (int*) realloc (array, (lastIndex + 1) * sizeof(int))

Вы выделяете на единицу меньше, чем нужно.

...