rusyska55011
@rusyska55011

Почему free() выводит ошибку?

Реализую двухсвязанный список. Для каждого элемента выделяю динамическую память, а когда хочу ее почистить, выдается окно с ошибкой в программе. Компилятор Visual Studio, стандарта C11
649c807aa0f2f932723540.png
mylist.c
typedef struct list_node {
	void* data;
	struct list_node* prev;
	struct list_node* next;
} list_node;

typedef struct list {
	unsigned count;
	list_node* last;
	list_node* first;
} list;

list* new_list() {
	list* new_list_obj = (list*)malloc(sizeof(list));

	new_list_obj->count = 0;
	new_list_obj->first = NULL;
	new_list_obj->last = NULL;

	return new_list_obj;
}

void append_node(list* this_list, const void* new_data) {
	list_node* new_node = (list_node*)malloc(sizeof(new_node));
	
	new_node->data = new_data;
	new_node->next = NULL;

	if (!this_list->count) {
		this_list->first = new_node;
		new_node->prev = NULL;

	} else {
		new_node->prev = this_list->last;
		this_list->last->next = new_node;

	}

	this_list->count++;
	this_list->last = new_node;
}

list_node* get_node(const list* this_list, signed index) {
	int converted_index = convert_beyond_index(index, this_list->count);
	const unsigned max_index = this_list->count - 1;

	list_node* node = NULL;
	if (max_index / 2 >= converted_index) {
		node = this_list->first;
		for (int i = 0; i < converted_index; i++)
			node = node->next;
	}
	else {
		node = this_list->last;
		for (int i = max_index; i > converted_index; i--)
			node = node->prev;
	}

	return node;
}

void delete_node(list* this_list, const signed index) {
	if (!this_list->count)
		return;

	list_node* deleted_node = get_node(this_list, index);

	list_node* next_node = deleted_node->next;
	list_node* prev_node = deleted_node->prev;

	if (this_list->count == 1) {
		this_list->first == NULL;
		this_list->last == NULL;
	}
	else if (this_list->first == deleted_node) {
		next_node->prev = deleted_node->prev;
		this_list->first = next_node;
	}
	else if (this_list->last == deleted_node) {
		prev_node->next = deleted_node->next;
		this_list->last = prev_node;
	}
	else {
		next_node->prev = deleted_node->prev;
		prev_node->next = deleted_node->next;
	}

	this_list->count--;

	free(deleted_node); // после этого выводится ошибка
}
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Какая-то проблема из-за чего один и тот же элемент удаляется дважды, судя по всему.

Вижу сразу ошибку в delete_node: Если вершина в списке всего одна, произойдет фингя: this_list->last не обновится, да и next_node->prev несуществующее будет переписано.
Ответ написан
vabka
@vabka
Токсичный шарпист
В функцию free ты должен передать сам deleted_node (указатель на кучу)
А ты передаёшь туда указатель на локальную переменную.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы