2012-06-29 2 views
0

Я читаю главу 17 C Primer Plus, а вот код segament освободить связанный список в книге:глава 17 C Primer Plus - о том, как освободить весь связанный список

/* Program done, so free allocated memory */ 
    current = head; 
    while (current != NULL) 
    { 
     free(current); 
     current = current->next; 
    } 
    printf("Bye!\n"); 
    return 0; 

} 

В инструкции while, как бы «текущая» переменная получила следующее значение после того, как уже была освобождена? Я искал некоторые сегрегации кода для бесплатных связанных списков в Интернете, и они, похоже, используют два указателя в инструкции while, чтобы избежать предыдущей проблемы.

Однако, если это ошибка, я не мог найти это в errata. Итак, любые комментарии?

Спасибо!

+3

Это ошибка в книге. Этот код вызывает неопределенное поведение. –

+0

Книга программирования с ошибкой Я в шоке ... УБЕДИТЕСЬ Я говорю! В других новостях небо голубое. Я, конечно, шучу, что такие ошибки никогда не исправляются. –

ответ

5

Да, это явно ошибка. Доступ к памяти кучи, которая была free() d, вызывает неопределенное поведение. Плохая книга!

Правильный путь в буфер next указатель перед вызовом free():

while (head != NULL) 
{ 
    struct list_node *next = head->next; 
    free(head); 
    head = next; 
} 

Примечания:

  • Нет необходимости помнить старую голову списка, так что падение current и обновить head вместо ,
  • Определите буферизацию следующего узла внутри цикла для локальности. Не уверен в правильном типе, у вас нет книги (к счастью!), И это не в вопросе.
+0

спасибо, я просто проверю, так как я действительно начинаю с указателем/списком. в целом, эта книга по-прежнему полезна :) – endless

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