2016-03-19 3 views
1

これは二重のポインタリンクされたリストの先頭にノードを挿入する機能が2回失敗したのはなぜですか?

void insertBefore(node_t **first) 
{ 
    node_t *new = NULL; 
    new = (node_t *) malloc(sizeof(node_t)); 
    new->next = *first; 
    *first = new; 
    free(new); 

} 

を使用して新しいノードを追加するために私の関数である私は一度それを使用している場合は、すべてが正常に動作するようです。しかし、私がもう一度それを使うと、私のリンクされたリストは台無しです。私は以下の出力イメージを持っています(同じことが、ノードを任意の位置に挿入する私の関数に起こりました)。 コードの特定の部分を入れようとしたので、他の部分で何か間違っていたに違いないと思われる場合は教えてください。 私は何が間違っていましたか?

The output image

+1

通常、あなたの 'node_t'構造は複数の要素を持つことになります。あなたのコードには通常、構造内の他のフィールドを初期化するために使用される1つ以上の他の関数パラメータがあります。少なくとも、他のすべてのフィールドが既知の値に初期化されていることを確認する必要があります( '' '' '0''または' 'NULL''はしばしばより良い値が存在しない場合の良い選択ですが、構造体には何が記述されています)。私はMCVE([MCVE])の作成について徹底的な仕事をしたと仮定します。 –

+0

[mallocの戻り値をキャストしない](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)変数名として 'new'を使用しているので、C++コンパイラを使用していません。 –

答えて

4

free(new);を削除してください。 new*firstは同じ値であるため、newを解放すると、*firstが解放されます。

洗練されたコード:

void insertBefore(node_t **first) 
{ 
    node_t *new = malloc(sizeof(node_t)); //don't cast 
    if(!new) 
    { 
     fputs("Don't have enough memory", stderr); 
     return; 
    } 
    new -> next = *first; 
    *first = new; 
} 
+0

ありがとうたくさん:D – CSDD

+0

@iharob合理的。回答が改善し、それを指摘してくれてありがとう! –

+0

あなたが実際に問題を修正し、機能を使用可能にするのをあなたが実際に手助けしてくれたので、私はこれを賞賛しました。 –

2

あなたfreeあなただけに割り当てられたノード。使用するたびに、*firstDangling Pointerになるため、未定義の動作が発生します。ポインタに格納されたアドレスは、関数free()が返っても有効ではなくなりました。

あなたのコードは、あなたがNULLnewを初期化する必要はありません多くの改善

  1. を必要とします。おそらくこれは最適化されるので問題はありません。

  2. malloc()または一般的にはvoid *を他のポインタ型にキャストする必要はありません。

  3. あなたはmalloc()が成功したかどうかをチェックしません。 newにエラーがあることを示すNULLが割り当てられていないことを確認する必要があります。

  4. 新しく割り当てられたポインタはfree()である必要があります。あなたがそれをもはや必要としないときにそれを割り当てた直後ではなく、free()にする必要があります。

  5. 本当にコードの書式を改善する必要があります。元の投稿では完全に判読できませんでした。

+0

Wow クール:D ありがとうございました:D – CSDD

+1

@CSDDあなたがそれ以上に助けになったと思ったり、あなたの判断基準に最もよく合った答えだと思うなら、答えを選び、スコアの下にあるチェックマークをクリックしてください。 –

2

メモリを解放しているためです。

free(new); 

最初に値を割り当てているだけです。

*first=new; 

ここで、firstとnewは同じメモリ位置を示します。それからあなたはその記憶を解放しています。行free(new);を削除します。

+0

それは働く ありがとう:D – CSDD

関連する問題