2016-04-21 10 views
2

私はこのプログラムを実行しようとしたとき、私はこのエラーが供給しています:ポップ機能にリンクされたリストは、glibcが検出された二重解放や破損

* glibcの検出* ./a.out:ダブル無料または破損(fasttop) :0x0000000001926070 ***

私は自分のポップ機能をCで作成しようとしていますが、上記のエラーが出ています。どこが間違っているのか分かりません。

struct node *pop(struct node *top, int *i) 
{ 
    struct node *new_node = top; 
    int count = 0; 

    if (new_node == NULL) { 
    return top; 
    } 

    while (new_node != NULL && (count < 1)) { 
    *i = new_node->value; 
    free(new_node); 
    new_node = new_node->next; 
    count++; 
    } 

    return new_node; 
} 
+0

どこでエラーが発生しますか?あなたはデバッガから何を得ますか?あなたは何を見つけようとしましたか? – Olaf

+0

1)発信者側の「トップ」を更新する必要があります。 2) 'free(new_node); new_node = new_node-> next; ':リリース後は使用しないでください。 – BLUEPIXY

答えて

1
free(new_node); 
new_node = new_node->next; 

あなたはそれを解放した後 objct にアクセスします。これにより、未定義の動作が呼び出されます。ひとたびリリースされると、オブジェクトにアクセスしてはいけません。

struct node *next = new_node->next; 
free(new_node); 
new_node = next; 

あなたのせいでの実際の原因である:

代わりに、一時的なポインタを使用しています。


しかし、あなたのコードがあまりにも複雑です:すでにNULLポインタnew_nodeをテストwhileループはとにかくtopと同じ値であるとして

  • if (new_node == NULL)は、不必要です。
  • countはループを最大で1回だけ行います。だから、ループは一切必要ありません。

この参照:

struct node *pop(struct node *top, int *i) 
{ 
    if (top != NULL) { 
     struct node *next = top->next; 
     *i = top->value; 
     free(top); 
     top = next; 
    } 
    return top; 
} 

は、それはおそらくより良いpop ED値を返し、(struct node **toptopとしてをポインタするのポインタを渡すことであることに注意してください。そうすれば、結果を直接使うことができます(もちろん、スタックは空ではないと仮定します)。

関連する問題