Ich habe Datenstruktur wie diese befreien:C - können nicht doppelt verknüpften Liste Knoten
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;
Ich kann Knoten erstellen, und die Liste macht Daten enthalten, weil ich in der Anzeige die Liste keine Probleme bekam, Einfügen oder Verschieben Aber Knoten ....
wenn ich Funktion schreiben, um die Liste zu löschen, ich habe Fehler:
PhoneBook(6187,0x7fff77045000) malloc: *** error for object 0x7f87c1f00004: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
das ist mein Radiergummi Funktionen:
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);
}
Bitte jemand sagt mir, was ich hier falsch gemacht habe. Vielen Dank!
Um einen einzelnen Knoten freizugeben, müssen Sie die Adresse des Knotens übergeben für eine Streichung des ersten Knotens zu berücksichtigen. z.B. 'void freeTelephoneBookNode (Knoten TelephoneBookNode **)'. Sie müssen alle nächsten/vorherigen Zeiger neu verdrahten, und wenn der erste Knoten gelöscht wird, aktualisieren Sie die Listenadresse auf den neuen ersten Knoten. –
Der Zeiger, den Sie an "freeTelephoneBookList" übergeben - woher kam es? Sie haben * einige * von dem, was hier für ein [minimales, vollständiges und verifizierbares Beispiel] (https://stackoverflow.com/help/mcve) benötigt wird, beenden Sie es einfach mit einem 'main()' und was auch immer es ist erforderlich, üben Sie Ihren Code bis zu dem Punkt des Scheiterns Sie behaupten. Wir haben keine Gedankenleser, und ich vermute, Ihr Anspruch von "Ich habe keine Probleme ..." ist nicht ganz korrekt. * "... das ich kenne" * wäre wahrscheinlich mehr. Edit: Nun, diese Funktion hat sich * komplett * geändert, also habe ich jetzt nichts mehr. – WhozCraig
@ DavidC.Rankin Das stimmt nicht. Es spielt keine Rolle, ob der nächste/vorherige Zeiger in einem Knoten oder der erste/letzte Zeiger in einer Liste in dem Moment, in dem der Knoten oder das Listenobjekt gelöscht wird, auf Null gesetzt wird. Wichtig ist, ob sie lange genug in einer zusätzlichen Variablen gehalten werden um den nächsten/vorherigen Knoten löschen zu lassen. Und sie sind. – CiaPan