Освобождение памяти от структуры в C - PullRequest
1 голос
/ 01 декабря 2010

У меня есть следующая структура для создания связанного списка, как я могу освободить выделенную память?

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


typedef  list  *LIST;  
typedef void pointer

У меня есть следующий список

LIST l1;
l1 = some_function(pointer);

Эти l1 созданы с использованиемнекоторые переменные.Это структура данных связанного списка, как я уже упоминал.Как освободить память, выделенную для l1?

[РЕДАКТИРОВАТЬ]

l1 содержит 8 байт памяти.

Ответы [ 3 ]

3 голосов
/ 01 декабря 2010

l1 не нуждается в освобождении. Это в стеке. Вернитесь из функции, в которой вы находитесь, и она автоматически исчезнет. Способ освободить то, на что указывает l1, аналогичен способу освобождения остальных элементов списка: пройтись по списку (используя ->number) и освободить каждый элемент по ходу.

LIST node = l1;
LIST next;
while (node != NULL)
{
    next = node->number;
    free(node);
    node = next;
}
2 голосов
/ 01 декабря 2010

Вы должны освободить указатели памяти индивидуально. Здесь на самом деле нет волшебной пули, вам нужно перебрать связанный список и освободить указатели для каждого узла, а затем, если сам связанный список выделен динамически, вы должны его освободить.

Важно освободить вещи в правильном порядке, чтобы вы не получили висячие указатели . Другими словами, если у вас есть указатель p, который указывает на другой указатель p2, вам нужно обязательно освободить p2, а затем p. Вы не хотите освобождать p, прежде чем освободить p2, потому что, когда вы пытаетесь освободить p2, вы проходите через висячий указатель (например, free (p-> p2), но p уже освобожден).

1 голос
/ 01 декабря 2010

Я думаю, что вы должны освободить каждый элемент списка вручную, начиная с l1, затем l1-> number и т. Д.

...