2010-12-01 17 views
1

Ich habe eine folgende Struktur zum Erstellen verknüpfter Liste, wie kann ich die zugewiesene Memeory freigeben?Freigeben des Speichers der Struktur in C

typedef struct linked_list { 
    struct linkedl_ist *number; 
    POINTER   house; 
} list; 


typedef list *LIST; 
typedef void pointer 

i Liste haben folgende

LIST l1; 
l1 = some_function(pointer); 

Diese l1 ist so konstruiert, einige Variablen. Dies ist eine verknüpfte Listendatenstruktur wie ich bereits erwähnt habe. Wie kann ich den zugewiesenen Speicher für l1 freigeben?

[EDIT]

l1 besitzt einen Speicher von 8 Byte.

+3

Es hängt davon ab, wie es zugeordnet ist. –

Antwort

3

l1 muss nicht freigegeben werden. Es ist auf dem Stapel. Kehre von der Funktion zurück, in der du bist, und sie wird automatisch verschwinden. Die Art und Weise zu befreien, was l1 zeigt, ist die gleiche wie die Art und Weise, den Rest der Elemente der Liste zu befreien: Gehen Sie die Liste (mit ->number) und befreien Sie jedes Element, wie Sie gehen.

LIST node = l1; 
LIST next; 
while (node != NULL) 
{ 
    next = node->number; 
    free(node); 
    node = next; 
} 
+3

Beachten Sie, dass 'l1' eine' liste * 'ist. Während also die Zeigervariable selbst nicht freigegeben werden muss, müssen Sie die "Liste" freigeben, auf die sie zeigt. –

+0

@Matthew: Whoops, verpasste das * in der Typedef. Vielen Dank. – nmichaels

2

Sie müssen die Speicherzeiger einzeln freigeben. Es gibt hier keine magische Kugel, Sie müssen die verknüpfte Liste durchlaufen und die Zeiger für jeden Knoten freigeben, und wenn Ihre verknüpfte Liste selbst dynamisch zugewiesen ist, müssen Sie diese freigeben.

Es ist wichtig, die Dinge in der richtigen Reihenfolge freizugeben, damit Sie nicht mit dangling pointers enden. Mit anderen Worten, wenn Sie den Zeiger p haben, der auf einen anderen Zeiger p2 zeigt, müssen Sie p2 und dann p freilassen. Sie wollen p nicht freigeben, bevor Sie p2 freigeben, denn wenn Sie versuchen, p2 freizugeben, gehen Sie durch einen freien Zeiger, um das zu tun (z. B. frei (p-> p2), aber p ist bereits freigegeben).

1

Ich denke, dass Sie jedes Element der Liste manuell freigeben sollen, von l1 starten, dann L1-> Nummer etc.

+0

Wenn du es so machst, musst du sehr, sehr vorsichtig sein. Wenn Sie "l1" freigeben und dann versuchen, auf "l1-> number" zuzugreifen, berühren Sie den Speicher, den Sie bereits freigegeben haben. Welches ist ein großes Nein. Wenn Sie dies so machen möchten, müssen Sie sicherstellen, dass Sie alle benötigten Daten in Locals ziehen, bevor Sie das Element tatsächlich freigeben. –

+0

Das stimmt. Eigentlich arbeite ich auch an dieser Liste, aber ich habe noch viel zu tun (wie du sehen kannst) :) – BlackBear

+0

Ich habe nicht viel Erfahrung in diesen Dingen. Können Sie mir bitte einige nützliche Links geben, auf die Sie sich beziehen, oder wahrscheinlich einige Beispiele dafür? – thetna

Verwandte Themen