У меня есть структура данных, как это:C - Невозможно освободить двусвязному список узлов
typedef struct telephoneBookNode
{
int id;
char name[NAME_LENGTH];
char telephone[TELEPHONE_LENGTH];
struct telephoneBookNode * previousNode;
struct telephoneBookNode * nextNode;
} TelephoneBookNode;
typedef struct telephoneBookList
{
TelephoneBookNode * head;
TelephoneBookNode * tail;
TelephoneBookNode * current;
unsigned size;
} TelephoneBookList;
Я могу создать узлы и сделать список, содержащий данные, потому что я не получил никаких проблем при отображении списка, вставки или перемещения Узлы ....
Но когда я пишу функцию, чтобы удалить список, я получил сообщение об ошибке:
PhoneBook(6187,0x7fff77045000) malloc: *** error for object 0x7f87c1f00004: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Это мой ластик функции:
void freeTelephoneBookList(TelephoneBookList* aList) {
TelephoneBookNode* node;
TelephoneBookNode* temp = aList->head;
while (temp) {
node = temp;
temp = node->nextNode;
freeTelephoneBookNode(node);
}
free(aList);
}
void freeTelephoneBookNode(TelephoneBookNode * node) {
free(node->name);
free(node->telephone);
free(node);
}
Пожалуйста, кто-нибудь скажет мне, что я здесь делаю неправильно. Спасибо!
Чтобы освободить один узел, вы должны передать адрес узла для учета удаления первого узла. например 'void freeTelephoneBookNode (узел телефонной книгиNode **). Вы должны переустановить все указатели next/prev и, если первый узел удален, обновите адрес списка до нового первого узла. –
Указатель, который вы передаете 'freeTelephoneBookList' - откуда он взялся? У вас есть * некоторые * того, что здесь необходимо для [минимального, полного и проверяемого примера] (https://stackoverflow.com/help/mcve), просто закончите его с помощью 'main()' и что еще необходимо выполнить свой код до отказа, который вы требуете. Мы не против читателей, и я подозреваю, что ваше утверждение «у меня нет проблем ...» не совсем точно. * «... что я знаю», вероятно, будет более. Edit: Ну, эта функция просто * полностью * изменилась, так что теперь я ничего не получил. – WhozCraig
@ DavidC.Rankin Это неправда. Не имеет значения, если указатели next/prev в узле или первые/последние указатели в списке обнуляются в момент удаления узла или объекта списка. Важно, если они сохраняются достаточно долго в дополнительной переменной чтобы удалить следующий/предыдущий узел. И они. – CiaPan