@DVoropaev
Ставлю + к карме на хабре за ответы на вопросы

Как исправить ошибку «unsorted double linked list corrupted»?

Пишу программу, которая используя библиотеку libgmp для длинной арифметики принимает число и выводит его квадрат:
#include <stdio.h>
#include <gmp.h>
#include <stdlib.h>

int main() {
	mpz_t mybignum;
	mpz_t mul;
	
	char *str = malloc(sizeof(char)*10000);
	scanf("%s", str);
	mpz_init_set_str(mybignum, str, 10);
	mpz_mul(mul, mybignum, mybignum);
	free(str);
	mpz_get_str (str,10 , mul);

	printf("%s\n", str);

	// освобождаем память
	mpz_clear(mybignum);
	mpz_clear(mul);
	free(str);
}

компилирую, запускаю, ввожу любое число:
$ gcc ./test.c -lgmp -o test
$ ./test 
12345
malloc(): unsorted double linked list corrupted
Аварийный останов

Хотел найти место, в котором происходит ошибка расставив printf'ы, но при добавлении printf в любое место, программа переставала падать с ошибкой.
  • Вопрос задан
  • 928 просмотров
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Это проблема работы с памятью. Вы там освобождаете память из-под str перед тем, как попросить gmp заполнить эту строку данными:
free(str);
mpz_get_str (str,10 , mul);


gmp пишет данные туда, где была строка. Но в это место нельзя писать после free. Иногда так получается. что менеджер памяти хранит там какие-то свои данные, которые вы портите и потом получаете об этом ошибку. Память может быть возвращена системе, и тогда программа может упасть вообще при попытке записать туда что-то. Или ничего заметного может не произойти вообще.

Как это часто бывает с ошибками работы с памятью, любая мелочь, вроде фазы луны или лишнего отладочного вывода где-то, может изменить то, как эта испорченная память используется и ошибка может не вызвать падения.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект