C Realloc Ошибка - «Утверждение` PTR == alloc_last_block 'не удалось! »
-
27-09-2019 - |
Вопрос
Я пишу функцию в 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
вдвойне важно.