2016-04-13 24 views
1

Ich versuche, eine Liste von PItem zu löschen. Dies ist die Erklärung von pItemLöschen der verknüpften Liste in c-crash

typedef struct Item{ 
    int num; 
    float price; 
    struct Item* next; 
}*PItem; 

Dies ist die Funktion, wo ich versuche, um die Liste zu löschen

void deleteList(PItem* ptr, PItem *tail){ 
    PItem *temp; 
    while ((*ptr)->next){ 
     temp = ptr; 
     *ptr = (*ptr)->next; 
     free(*temp); 
    } 
    tail = NULL; 
} 

Die seltsame ist, dass es nur auf dem zweiten Durchlauf der Schleife, bevor die

stürzt
free(*temp); 

Weiß jemand, was das Problem ist?

Vielen Dank im Voraus.

+0

Im Debug-Modus haben Sie garantiert, dass die Kopf verliert seine Referenz nicht? Gibt es irgendwelche Fehler? wenn ja, poste es/sie. oder es knallt dich sofort an? –

+0

stürzt sofort ab - keine Fehler – alonpeer12345

+0

Das ist mir während der Programmierung nie passiert. Ich kenne keinen Fehler, der sofort zum Absturz bringen würde. VS Haben Sie versucht, die Protokolle auf Fehler zu überprüfen? –

Antwort

0

Das Problem ist, dass Sie mehr Indirektion verwenden, als Sie benötigen. Die temp Variable sollte ein Zeiger sein, kein Zeiger auf Zeiger. Hier ist, was passiert, wenn Sie dies tun:

// Temp points to the same pointer as ptr, so 
temp = ptr; 
// when the value pointed to by ptr changes, so does the value pointed to by temp 
*ptr = (*ptr)->next; 
// When you free *temp, you also free *ptr 
free(*temp); 

Befestigung dieses Problem einfach: erklären temp als PItem, und es verwenden, Kopien von ptr zu machen:

PItem temp; 
while (*ptr) { // Loop should proceed till *ptr is NULL, not (*ptr)->next 
    temp = *ptr; // Copy the pointer's value 
    *ptr = temp->next; // Advance *ptr 
    free(temp); // Delete temp, which points to the old *ptr 
} 
// tail is a pointer to a pointer, so you should add * to the assignment 
*tail = NULL; 
Verwandte Themen