2011-12-15 3 views
2

私は、そのノード構造今私たちにいくつかの場所にポインタを運ぶノードの空きメモリを行う方法

struct node 
    { 
    char *p; 
    struct node *next; 
    }*start; 

以下の通りである私たちは* char型pはmalloc関数call.Similarlyによって割り当てられたメモリ位置へのポインタであるリンクリストを持っています全体もmallocを使って割り当てられます。さて、

main() 
{ 
    struct node *tmp; 
    tmp=malloc(sizeof(struct node)); 
    tmp->next=NULL; 
    tmp->p=malloc(2*sizeof(int)); 

    free(tmp->p); 
    free(tmp); 

} 

以下のようなもの、それはここに必要な空きメモリか何かに正しい方法ですがmalloc関数呼び出しの両方が占有するスペースを解放したいと思いますか?

答えて

2

これは正しい方法ですが、使用した後にNULLにポインタを割り当てることを忘れないと、ポインタがぶら下がりポインタになります。

は、このようにそれらを使用する -

無料(tmp-> P); tmp-> p = NULL。

+0

はいポイントtmp-> p-NULLについては問題ありませんが、tmp-> p = NULLステートメントではないかどうかを知りたいのですが、セグメント違反の可能性はありますか? –

+1

いいえこの場合、抱擁ポインタを逆参照しないので、segfaultの可能性はありません。あなたのコードにぶら下がっているポインタが存在するだけでは、segfaultは発生しません。 Segfaultは正直な間違いのために手をつけたポインタを使用しようとするときに発生します。ノードを解放した後にポインタpを逆参照しようとすると、segfaultが発生することがあります。このようなものはsegfault - > free(tmp-> p)になります。 *(tmp-> p); // segfault。 – Ameliorator

+0

この文を印刷しようとしました*(tmp-> p)まだセグメンテーションフォールト –

0

通常は最初のノードへのポインタがあり、ポインタをたどってリストをループしますが、正しく解放しています。例えば

struct node *first; 
... list created, first pointing to first in list, where last next is == NULL ... 

while (first != NULL) 
{ 
    struct node* next = first->next; 
    free(first->p); 
    free(first); 
    first = next; 
} 

ところで、なぜあなたはchar*としてpを宣言するが、int型を割り当てるのですか?打ち間違え?

+0

Ameliorationによって作成されたポイントを見て、それを解放した後にNULLへのポインタを割り当てましたか?彼が非常に重要なポイントを作ったとは思わないか –

関連する問題