0

次のコードを使用して、C の片方向リストのすべてのノードを削除しようとしています。

void free_all(struct cd *head){                                                 
    struct cd *tmp;                                                                                                                                            
    tmp = head->next;                                                           
    while(tmp != NULL){                                                         
        head->next = tmp->next;                                                 
        free(tmp);                                                              
        tmp = head->next;                                                       
    }                                                                           
    free(head->next);                                                           
    free(head);                                                                 
    head=NULL;                                                                  
}          

しかし、その後、リンクされたリストのすべての要素を印刷して、リストが空かどうかを確認すると、「ヘッド」要素が常に印刷されます。head 要素が適切に削除されていないようです。どうしたの?

4

1 に答える 1

4

'head' は、ローカル スコープの関数引数です。したがって、関数の最後で NULL に設定しても、関数は直後に戻り、その変数をスコープ外に移動するため、これは効果がありません。

渡された変数が何であれ、リストの先頭を指します (このメモリは解放されていますが、妥当なデータが含まれている可能性があります)。

解放されました。以前は存在していたメモリへのポインターを保持しているため、必ずしもそのように見えるとは限りません。

これを修正するには、この関数を呼び出してリストを解放した、ポインターを null にするだけです。

free_all(actual_head);
actual_head = NULL;

関数内でポインターを NULL にするために、ポインターへのポインターを渡すこともできますが、この状況ではそれは非常に複雑に思えます。

于 2012-12-07T21:51:51.200 に答える