2016-12-31 6 views
1
node* curr = top; 
    do { 
    free(curr); //free saved pointer 
    curr = curr->next; //advance head to next element 
    } while (curr!=top); 

上記のような循環リンクリストのメモリを解放するには、どのように各ポインタもnullに設定できますか?円リンクリストを解放するときにポインタをnullに設定する方法

+0

「ヌルへのポインタ」とは何ですか? _nullポインター_があり、_nullポインターconstant_をポインターに割り当てることができます。しかし、 "nullへのポインタ"は通常のポインタ値になります。 – Olaf

+3

あなたが 'free(curr)'を呼んだら、 'curr-> next'を逆参照することはできません。それはもはやあなたのものではなく、以前とは異なる情報を含んでいる可能性があります。 –

答えて

3

とにかくノードを解放しているので、ノードに含まれているポインタをリセットする必要はありません。

コードが表示されるコンテキストによっては、末尾にtop = NULLを設定する必要があります。どのような場合でもこれを行うことが良い習慣であると主張することができます。

多少の関連したメモでは、コードにバグがあります。curr = curr->nextは、割り当て解除されたポインタを逆参照し、結果はundefined behaviourです。これを修正する方法の1つは次のようなものです:

node* curr = top; 
node* next; 
do { 
    next = curr->next; 
    free(curr); 
    curr = next; 
} while (curr!=top); 

また、コードでは空のリストの解放が正しく処理されないことに注意してください。これを修正することは、読者の練習として残されています。

+0

合意。正しい解決策は、ポインタを含む現在のオブジェクトを解放する前に、ポインタの値を次のものにコピーすることです。 – clearlight

0

ポインタのポインタのデータ型と同じデータ型に一定のゼロをキャストヌルポインタを作るために:

dataType *pointer = (same dataType*) 0 ; 
関連する問題