realloc () не работает после повторных вызовов - PullRequest
0 голосов
/ 02 марта 2012

Я реализую некоторую полиномиальную арифметику в C. Я использую динамическую структуру для хранения целочисленных факторов и степени полинома. Помимо других функций мне нужна операция p [X] * X, поэтому я пытаюсь реализовать какой-то сдвиг вправо.

Но через несколько смен realloc () вылетает в моей программе. В этом примере это при третьем вызове, но если я пытаюсь сдвинуться 2 и 4 раза, он падает после второго.

/* Simple polynom type with variable length and degree n-1. */
typedef struct {
    int n;
    int *factors;
} polynom_t;


polynom_t *poly_init(int n) {
    polynom_t *p_new = malloc(sizeof(polynom_t));
    p_new->n = n;
    p_new->factors = calloc(n, sizeof(int));

    return p_new;
}

void poly_clear(polynom_t *p) {
    free(p->factors);
    free(p);
    p = NULL;
}


void poly_set(polynom_t *p, int a[], int len){
    memcpy(p->factors, a, sizeof(int)*p->n);
}


void _poly_rsz(polynom_t *p, int n) {
    if (n != p->n) {
        p->n = n;

        // This realloc() seems to fail
        p->factors = realloc(p->factors, sizeof(int) * n);
    }
}


void _poly_lsr(polynom_t *p, int i) {
    _poly_rsz(p, p->n + i);
    memmove(p->factors + i, p->factors, sizeof(int)*(p->n));
    memset(p->factors, 0, sizeof(int)*i);
}


int main(int argc, char **argv) {
    polynom_t *p2 = poly_init(11);
    int a2[11] = {1, 2, 0, 2, 2, 1, 0, 2, 1, 2, 0};
    poly_set(p2, a2, 11);
    _poly_lsr(p2, 1);  // works as expected
    _poly_lsr(p2, 1);  // works as expected
    _poly_lsr(p2, 1);  // crash
    poly_clear(p2);

    return 0;
}

1 Ответ

5 голосов
/ 02 марта 2012

Проблема с этим блоком кода здесь:

void _poly_lsr(polynom_t *p, int i) {
    _poly_rsz(p, p->n + i);
    memmove(p->factors + i, p->factors, sizeof(int)*(p->n));  // the problem is here!
    memset(p->factors, 0, sizeof(int)*i);
}

Когда вы изменяете размер своего полинома, вы сбрасываете его счетчик, что означает, что при добавлении 1 вы переполняете границы вашего полинома.массив на 1. Чтобы исправить, просто вычтите i из числа memmove:

memmove(p->factors + i, p->factors, sizeof(int)*(p->n - i));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...