C Realloc Ошибка - «Утверждение` PTR == alloc_last_block 'не удалось! »

StackOverflow https://stackoverflow.com/questions/3860587

Вопрос

Я пишу функцию в C, которая принимает соединенный список и предикат и возвращает массив, содержащий все значения связанного списка, удовлетворяющего этому условию. Вот функция:

void **get_all_that(list_t *l, int (*pred)(const void *)) {
    void **vals = NULL;
    int i = 0; // Number of matches found
    const size_t vps = sizeof(void *);
    node_t *n = l->first;
    while (n) {
        if (pred(n->value)) {
            vals = (void **)realloc(vals, i*vps); // (*)
            vals[i] = n->value;
            i++;
        }
        n = n->next;
    }
    if (vals != NULL) {
        vals = (void **)realloc(vals, i*vps);
        vals[i] = NULL; // NULL-terminate array
    }
    return vals;
}

Я прошел в предикате, который возвращается 1 всегда (т.е. get_all_that в основном to_array), и я получаю ошибку в выбранной линию на итерации, где I = 4. Ошибка на заднем корте (которая была автоматически напечатана из Sigabrt) IS "*** Glibc Dreaced *** ~ / list / Test: Realloc (): Неверный Далее Размер: 0x0804C0e8 ***"

Я открыл GDB, рассказывая ему, чтобы он сломался прямо перед вызовом Realloc, когда I = 4. Затем я попробовал позвонить Realloc (vals, i * vps) вручную от GDB и получил сообщение об ошибке: «Несоответствие, обнаруженное LD.SO: DL-MINIMAL.c: 138: Realloc: Assertion: PTR == alloc_last_block 'не удалось!»

Кто-нибудь знает, что происходит?

Это было полезно?

Решение

Твой realloc выделяется слишком мало элементов. Попробуйте заменить i к i+1. Отказ Вы также должны проверить на невыполнение realloc Перед заменой указателя вы передали ему, так как иначе вы получите утечку памяти (не говоря уже о сбои, так как вы не можете проверить NULL) о неудаче, и удаление ненужных и уродливых отложений от возвращаемой стоимости realloc Было бы неплохо тоже.

Другие советы

И ваш первый realloc называет длину 0, что является free. Отказ Так что совет поставить i+1 вдвойне важно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top