0

私は C Primer Plus の第 17 章を読んでいます。この本のリンク リストを解放するコード セグメントは次のとおりです。

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

}

while ステートメントでは、「現在の」変数が解放された後に次の値を取得するにはどうすればよいでしょうか? Web でリンク リストを解放するコード セグメントをいくつか検索しましたが、前の問題を回避するために while ステートメントで 2 つのポインターを使用しているようです。

ただし、これがバグである場合、正誤表でこれを見つけることができませんでした。コメントはありますか?

ありがとう!

4

1 に答える 1

5

はい、明らかにバグです。dされたヒープ メモリにアクセスすると、free()未定義の動作が発生します。悪い本!

next適切な方法は、呼び出す前にポインターをバッファーすることfree()です。

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

ノート:

  • リストの古い先頭を覚えておく必要はないので、代わりに削除currentして更新headします。
  • 局所性のために、ループ内の次のノードのバッファリングを定義します。適切なタイプがわからない、本を持っていない (幸いなことに!)、それは問題ではありません。
于 2012-06-29T13:08:28.383 に答える