2013-07-24 3 views

ответ

5

Ваш связанный список должен быть как:

head 
+---+ +---+ +---+        
| 1 |--->| 2 |--->| 3 |---+ 
+---+ +---+ +---+ |         
         null 

head узел хранит адрес кулака узла только я f вы делаете free(head), тогда он освободит память первого узла со значением 1только и другие узлы все еще находятся в памяти и действительны для доступа к ним, но сначала вы должны сохранить адрес узла 2, чтобы получить доступ к связанному списку (иначе у вас будет утечка памяти в вашем коде).

ли как:

new_head = head->next; 
    free(head); 

После того, как вы освободить/свободный() память, его Неопределенное поведение, чтобы получить доступ, что нет (адрес становится недействительным).

Из комментариев:

  1. Да, вам нужен цикл для свободного() памяти для всех узлов связанного списка, сделать что-то вроде этого:

    while(head){   // while head not null 
        new_head = head->next; // first save address of next 
        free(head);   // free first node 
        head = new_head;  // set head to next node, not yet free 
    } 
    
  2. comment- 2:
    Если вы не удаляете/не освобождаете динамически выделенную память в своей программе, тогда она останется выделенной для вашего процесса до тех пор, пока он не завершится (помните, в C у нас нет сборщика мусора). Динамически выделяемая память имеет срок службы, пока ваша программа не завершится. Поэтому, если вы закончили работу с выделенной памятью, освободите ее явно.
+0

поэтому используйте цикл и удалите узел один за другим - это единственный выбор, который у меня есть или есть способ удалить список за один раз. –

+0

@System_Coder ok вы хотите удалить полный список, да вам нужен цикл для свободной() памяти для всех узлов –

+0

Grijesh Chauhan здесь, в комментарии Dinesh говорит, что если я позвоню бесплатно (глава), то весь связанный список будет удален , –

1

Освобождение головного узла просто освобождает память, выделенную головному узлу. Остальные узлы списка будут сохранены. Затем вы должны указать голову на следующего члена списка. Для примера рассмотрим следующий единый связанный список,

A -> B -> C -> D -> Null

После освобождения узла головки и перемещения головки к узлу В, связанный список будет выглядеть как это

B -> C -> D -> Null

1

Освобождение головного узла списка освобождает только этот узел, не остальная часть списка.

Это основное отличие между массивами и связанными списками - память разделяется. Вот иллюстрация:

struct testnode { 
     int a; 
     int b; 
     struct testnode * next; 
}; 

В массиве памяти может выглядеть следующим образом:

struct testnode test[3]; 

0x............0000 &test[0] // on a typical computer 
0x............0020 &test[1] 
0x............0040 &test[2] 

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

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

struct testnode * head; 

// after insertions 

0x............0000 head 
0x............634f head->next 
0x............114d head->next->next 

Обратите внимание, как память несортированный (хотя это не всегда может быть что из строя). И высвобождение head освободит только head узел, оставив остальную память нетронутой.

+0

спасибо @Taylor Flores –

0

Нет, когда вы освобождаете головной узел связанного списка, вы отмечаете только память, которая используется как «свободная для использования». Таким образом, другие узлы в памяти по-прежнему будут помечены как «в использовании».

Технически вы все еще можете использовать свободную память, но это неопределенное поведение, поэтому нет гарантий, что данные (включая указатели) по-прежнему правильны для использования.

Если вы хотите удалить все узлы из памяти, вы должны сделать это рекурсивно (с указатель точки зрения).

Смежные вопросы