realloc (): неверный следующий размер после двух вычислений - PullRequest
0 голосов
/ 08 апреля 2019

Я создал структуру для хранения массива цифр. Массив выделяется динамически. Проблема возникает при попытке перераспределить некоторое пространство в функции. Ошибка

realloc(): invalid next size
Aborted (core dumped)

Структура выглядит следующим образом

typedef struct big_number {
    unsigned int *digits;
    int num_of_digits;
}BigNumber;

Функция выглядит следующим образом (умножает цифру на BigNumber):

void scale(BigNumber a, int c, BigNumber* scaled)
{
    scaled->num_of_digits = a.num_of_digits;
    scaled->digits = NULL;
    scaled->digits = malloc(scaled->num_of_digits * sizeof (unsigned int));

    if (scaled->digits == NULL) {
        error();
    }

    int carry = 0;
    for (int i = scaled->num_of_digits; i >= 0; i--) {
        int tmp = a.digits[i] * c + carry;
        scaled->digits[i] = tmp % 10;
        carry = tmp / 10;
    }

    if (carry != 0) {
        //While trying realloc in this line problem occurs
        scaled->num_of_digits += 1;
        scaled->digits = realloc(scaled->digits, scaled->num_of_digits * sizeof (unsigned int));
        scaled->digits[0] = carry;
    }
}

Звонки в основном выглядят так:

    printf("Results:\n");

    scale(num_b, 5, &pomocna);
    print_big_number(pomocna);
    free(pomocna.digits);

1 Ответ

2 голосов
/ 08 апреля 2019

Массивы идут от 0 до n-1.Вы пишете в array[n], который не существует

scaled->digits = malloc(scaled->num_of_digits * sizeof (unsigned int));
for (int i = scaled->num_of_digits; i >= 0; i--) { // AAA
        int tmp = a.digits[i] * c + carry;
        scaled->digits[i] = tmp % 10;             // BBB

В строке AAA вы устанавливаете i для размера массива (n)

В строке BBB вы пытаетесьизменить scaled->digits[i] (array[n])

...