2016-05-28 14 views
-1

を解放することができませんが、私はこのようなデータ構造を持っていますノード....C二重リンクリストノード

しかし、私はリストを消去する関数を書くとき、私はエラーを得た:

PhoneBook(6187,0x7fff77045000) malloc: *** error for object 0x7f87c1f00004: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

これは私の消しゴム機能である:

void freeTelephoneBookList(TelephoneBookList* aList) { 
    TelephoneBookNode* node; 
    TelephoneBookNode* temp = aList->head; 

    while (temp) { 
     node = temp; 
     temp = node->nextNode; 
     freeTelephoneBookNode(node); 
    } 
    free(aList); 
} 

void freeTelephoneBookNode(TelephoneBookNode * node) { 
    free(node->name); 
    free(node->telephone); 
    free(node); 
} 

私がここで間違っていることを教えてください。ありがとうございました!

+0

freeTelephoneBookNode機能を削減し、あなたは最初のノードの削除を考慮するために、ノードのアドレスを渡す必要があります。例えば'void freeTelephoneBookNode(TelephoneBookNode ** node)'です。すべてのnext/prevポインタをrewireしなければならず、最初のノードが削除された場合は、リストアドレスを新しい最初のノードに更新します。 –

+1

あなたが 'freeTelephoneBookList'に渡しているポインタ - どこから来たのですか? [最小限で完全で検証可能な例](https://stackoverflow.com/help/mcve)のためにここに必要なものがいくつかありますが、それは 'main()'で終わります。あなたが主張する失敗のポイントまであなたのコードを実行する必要があります。私たちは読者を気にするものではなく、私はあなたに「問題はありません」と主張していると思っています。 * "私が知っている..." *おそらくもっとそうだろう。編集:まあ、その機能はちょうど*完全に変更されたので、今は何も得られません。 – WhozCraig

+0

@ DavidC.Rankinそうではありません。ノード内のnext/prevポインタ、またはリスト内の最初/最後のポインタが、ノードまたはリストオブジェクトが削除された瞬間にゼロになるかどうかは重要ではありません。次の/ prevノードを削除させます。そして彼らは。 – CiaPan

答えて

2

注記この質問は質問のinitial versionに関連しています。

変数node->namenode->telephoneは、メモリの割り当てられたブロックを分離するないのポインタである、彼らは*nodeの部分だけです。単一ノードを解放するには

void freeTelephoneBookNode(TelephoneBookNode * node) { 
    free(node); 
} 
+0

このようなこの機能を変更すると、プログラムはエラーを表示せずにクラッシュしました。その後、コードを修正して投稿を更新しようとしました。私はprintf( "1")を 'if'ブロックに、printf(" 2 ")を' else'ブロックに書いたので、実行時にこのシーケンスを得ました:222222222222222222211。リストを最後のノードまで消去すると、墜落した –

+0

@LKPhucNguyen 1.あなたのコードに 'if'または' else'ブロックが含まれていません。別のコードについて議論したい場合は、別の質問を投稿してください。 2.あなたの 'freeTelephoneBookList'はIMHOです.'freeTelephoneBookNode'に' freeTelephoneBookNode'で 'free * 'というエラーが発生しています。 3。別のエラーが発生した場合は、おそらくデータの不一致が原因です。あなたはそれをより良く診断するか、完全なコードで新しい質問を投稿する必要があります。 [**最小限で完全で検証可能なサンプルの作成方法**](http://stackoverflow.com/help/mcve)を参照してください。 – CiaPan