2010-12-01 11 views
1

私はリンクされたリストを作成するために次のような構造を持っていますが、どうすれば割り当てられたmemeoryを解放できますか?Cの構造のメモリを解放する

typedef struct linked_list { 
    struct linkedl_ist *number; 
    POINTER   house; 
} list; 


typedef list *LIST; 
typedef void pointer 

私はこれらのl1は、いくつかの変数を用いて構成されているリスト

LIST l1; 
l1 = some_function(pointer); 

を次のようしています。私が言及したように、これはリンクされたリストのデータ構造です。 l1に割り当てられたメモリを解放するにはどうすればよいですか?

[編集]

l1 8バイトのメモリを保持します。

+3

など、その後L1->番号、あなたがL1から始まる、手動であなたのリストの各要素を解放すべきだと思います。 –

答えて

3

l1は解放する必要はありません。それはスタック上にあります。あなたが入っている機能から戻り、それは自動的に遠ざかります。 l1が指し示すものを解放する方法は、リストの残りの要素を解放する方法と同じです:リストを歩いて(->numberを使用して)、移動するごとに各要素を解放します。

LIST node = l1; 
LIST next; 
while (node != NULL) 
{ 
    next = node->number; 
    free(node); 
    node = next; 
} 
+3

'l1'は' list * 'であることに注意してください。だから、ポインタ変数自体は解放する必要はありませんが、あなたが指している 'list'を解放する必要があります。 –

+0

@Matthew:おっと、typedefの*を忘れてしまった。ありがとう。 – nmichaels

2

メモリポインタを個別に解放する必要があります。実際には魔法の弾丸はありません。リンクされたリストをループして各ノードのポインタを解放する必要があります。リンクされたリスト自体が動的に割り当てられている場合は、解放する必要があります。

正しい順序で物を解放して、dangling pointersにならないようにすることが重要です。つまり、ポインタpが別のポインタp2を指している場合は、必ずp2を解放してからpを解放する必要があります。 p2を解放しようとすると、それを行うためにぶら下がっているポインタ(p2> p2)が出ていますが、pはすでに解放されています)ので、p2を解放する前にpを解放する必要はありません。

1

私はそれはそれが割り当てられている方法によって異なり

+0

このようにすれば、非常に慎重でなければならないでしょう。 'l1'を解放してから' l1-> number'にアクセスしようとすると、すでに解放したメモリに触れています。それは大きなノーではありません。このようにしたい場合は、実際に要素を解放する前に、必要なすべてのデータを地元の人々に引き出す必要があります。 –

+0

そうです。実際に私はこれらのリストにも取り組んでいますが、(私が見ることができるように)まだ多くの作業があります:) – BlackBear

+0

私はこれらのことについて多くの経験がありません。あなたが参考にした役に立つリンクや、おそらくいくつかの例を教えてください。 – thetna