Почему я не могу перераспределить * sm, используя reallo c? - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть эта функция в моей программе, в которой указатель * sm показывает ошибку при перераспределении. Я попытался с помощью mallo c и free вручную изменить размер * sm, но такая же ошибка отображается в функции free.

char *numc_util_add_str(char **str, int s) {
    int size = 1;
    char *sm = (char *)malloc(size + 1);
    sm[0] = '0';
    sm[1] = '\0';
    while (s--) {
        int l = strlen(str[s]);
        int sz = l > size ? l : size;
        int t, r, car = 0;
        for (register int i = 0; i < sz; i++) {
            t = (i <= l ? str[s][i] - 48 : 0) + (i <= size ? sm[i] - 48 : 0) + car;
            r = t % 10;
            car = t / 10;
            sm[i] = 48 + r;
        }
        if (car) {
            size++;
            sm = (char *)realloc(sm, size + 1);
            sm[size - 1] = 48 + r;
        }
        sm[size + 1] = '\0';
    }
    return sm;
}

Это отображается при отладке:

    sm = (char *)realloc(sm, size + 1);
// Exception has occurred.
// Trace/breakpoint trap

1 Ответ

1 голос
/ 21 февраля 2020

Вы назначаете за пределами sm.

Эта строка:

int sz = l > size ? l : size;

устанавливает sz на большее из l и size. Затем вы используете sz в качестве границы for l oop. В l oop вы делаете:

sm[i] = 48 + r;

Если l больше size, i также станет больше size, но size является максимальным индексом массив sm.

Я не понимаю, что вы пытаетесь сделать, поэтому я не уверен, что такое правильное исправление. Может быть, просто сделайте

sm = realloc(sm, sz);

до for l oop.

...