2016-05-28 2 views
-1

У меня есть структура данных, как это: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); 
} 

Пожалуйста, кто-нибудь скажет мне, что я здесь делаю неправильно. Спасибо!

+0

Чтобы освободить один узел, вы должны передать адрес узла для учета удаления первого узла. например 'void freeTelephoneBookNode (узел телефонной книгиNode **). Вы должны переустановить все указатели next/prev и, если первый узел удален, обновите адрес списка до нового первого узла. –

+1

Указатель, который вы передаете 'freeTelephoneBookList' - откуда он взялся? У вас есть * некоторые * того, что здесь необходимо для [минимального, полного и проверяемого примера] (https://stackoverflow.com/help/mcve), просто закончите его с помощью 'main()' и что еще необходимо выполнить свой код до отказа, который вы требуете. Мы не против читателей, и я подозреваю, что ваше утверждение «у меня нет проблем ...» не совсем точно. * «... что я знаю», вероятно, будет более. Edit: Ну, эта функция просто * полностью * изменилась, так что теперь я ничего не получил. – WhozCraig

+0

@ DavidC.Rankin Это неправда. Не имеет значения, если указатели next/prev в узле или первые/последние указатели в списке обнуляются в момент удаления узла или объекта списка. Важно, если они сохраняются достаточно долго в дополнительной переменной чтобы удалить следующий/предыдущий узел. И они. – CiaPan

ответ

2

ПРИМЕЧАНИЕ Этот вопросник относится к вопросу initial version.

Переменных node->name и node->telephone являются не указателей отделяющего выделенных блоков памяти, они просто части *node. Снизить freeTelephoneBookNode функции

void freeTelephoneBookNode(TelephoneBookNode * node) { 
    free(node); 
} 
+0

, когда я меняю эту функцию, программа была разбита с ошибкой. Затем я попытался исправить код и обновить сообщение. Я написал printf («1») в блоке 'if' и printf (« 2 ») в блоке' else', я получил эту последовательность при ее запуске: 222222222222222222211. Поэтому, когда он стирает список до последнего узла, он потерпел крах. –

+0

@LKPhucNguyen 1. Ваш код не содержит блоков 'if' или' else'. Если вы хотите обсудить другой фрагмент кода, задайте другой вопрос. 2. Ваш 'freeTelephoneBookList' является IMHO правильным, ошибка с' free'-ing 'не выделенным блоком', конечно * может * возникнуть в 'freeTelephoneBookNode', и я дал решение выше. 3.Если вы получите еще одну ошибку, возможно, это связано с несогласованностью ваших данных. Вам нужно либо лучше диагностировать его, либо задать новый вопрос с полным кодом. См. [** Как создать минимальный, полный и проверенный пример **] (http://stackoverflow.com/help/mcve) – CiaPan

Смежные вопросы