2016-10-14 1 views
0

Ich versuche, die Daten im Knoten nach dem Freigeben des Knotens zurückzugeben. Aber ich erhalte segfault, wenn ich das versuche (ich schätze, wenn ich den elem-Wert den variablen Daten zuordne, kopiert er nur die Referenz. Nachdem die Speicherstelle des Knotens frei geworden ist, verlieren wir das Element elem innerhalb des Knotens struct. Daher ist es illegal, das Element über seine Referenz abzurufen. Gibt es eine andere Möglichkeit, es zu tun?Wie kann auf die Daten in einem Knoten zugegriffen werden, dessen Speicherort freigegeben wurde?

void* remove_node(struct s_node** node){ 
if(node != NULL && *node!= NULL && (*node)->elem != NULL){ 
    void* data = (*node)->elem; 
    if((*node)->prev == NULL && (*node)->next == NULL){ 
     free(*node); 
    }else if((*node)->prev == NULL){ 
     (*node)->next->prev = NULL; 
     (*node)->next = NULL; 
     free(*node); 
    }else if((*node)->next == NULL){ 
     (*node)->prev->next = NULL; 
     (*node)->prev = NULL; 
     free(*node); 
    }else{ 
     (*node)->prev->next = (*node)->next; 
     (*node)->next->prev = (*node)->prev; 
     (*node)->prev = NULL; 
     (*node)->next = NULL; 
     free(*node); 
    } 
    return data; 
}else{ 
    return NULL; 
} 

}

Und hier ist die Struktur

struct s_node { 
void* elem; 
struct s_node* next; 
struct s_node* prev; 
}; 
+2

eine Kopie davon machen, bevor Sie es – JJF

+0

frei Wie Sie einen Knoten erstellen Sie? –

+2

Warum befreien Sie es, bevor Sie damit fertig sind? –

Antwort

1

Der Code geschrieben scheint nicht den Fehler zu verursachen Sie beobachten. Die Baumstruktur könnte an anderer Stelle beschädigt werden.

ist jedoch zu beachten, dass es drastisch vereinfacht werden kann:

void *remove_node(struct s_node **node) { 
    if (node != NULL && *node != NULL && (*node)->elem != NULL) { 
     void *data = (*node)->elem; 
     if ((*node)->prev != NULL) (*node)->prev->next = (*node)->next; 
     if ((*node)->next != NULL) (*node)->next->prev = (*node)->prev; 
     free(*node); 
     *node = NULL; /* safely, cannot hurt */ 
     return data; 
    } else { 
     return NULL; 
    } 
} 
Verwandte Themen