2017-07-16 7 views
0

私は現在、スペルチェッカー(CS50s pset5、それを知っている人向け)に取り組んでいます。私はトライを使って検索していますが、今は問題を取り除いています。この関数はfree()を初めて試みるときに失敗します。私の推測では、ポインタが何を指しているのではなく、ポインタを解放しようとしていますが、私は完全に間違っている可能性があります。TRIEを解放するには?

私の具体的な質問は、free()の機能がここで失敗するのはなぜですか? (エラー:ダブル無料または破損(アウト):0x00000000006020c0 ***)

ノードのマイdefiniton:

typedef struct node 
{ 
    bool wordHere; 
    struct node* children[27]; 
}node; 

マイアンロード機能:

node* currentNodePtr = &root; 
bool unload(void) 
{ 
    node* ptrArray[27] = {NULL}; 

    for(int i = 0; i < 27; i++) 
    { 
     ptrArray[i] = currentNodePtr -> children[i]; 
    } 

    free(currentNodePtr); 

    for(int c = 0; c < 27; c++) 
    { 
     if(ptrArray[c] != NULL) 
     { 
      currentNodePtr = ptrArray[c]; 
     } 

     unload(); 
    } 

    return 0; 
} 
+0

はそれを作るためにはるかに良いでしょう ''アンロードのパラメータをcurrentNodePtr' 'グローバル変数の代わりに。 – interjay

+0

残念なことに私はこのことを許可されていない私の任務に服していますが、それはずっと良くなっています。ありがとう! –

答えて

2

これは、オブジェクトrootようです動的に割り当てられませんでした。

したがって、ポインタcurrentNodePtrは、動的に割り当てられたオブジェクトを指しません。

node* currentNodePtr = &root; 

したがって、あなたは、このポインタに

free(currentNodePtr); 

を呼び出すことはできません。

最初にオブジェクトrootを他のノードとして動的に割り当てる必要があります。

あなたが関数の先頭にあなたはポインタがNULLに等しいかどうかをチェックしないので、if文

if(ptrArray[c] != NULL) 
    { 
     currentNodePtr = ptrArray[c]; 
     unload(); 
    } 

内の関数の再帰呼び出しを含める必要が第二の問題。

ポインタのcurrentNodePtrNULLと等しくないことを確認することが、機能の冒頭では優れていますが、

また、関数がグローバル変数を使用する場合は、あまり良い考えではありません。グローバル変数currentNodePtrを使用する代わりに、関数のパラメータにしてください。

+0

ありがとう!だから私はルートを作成するためにmallocを使用する必要があり、私は良いはずですか? –

+0

@MichaelKellerはい、mallocを使用してルートを作成する必要があります。また、関数の再帰呼び出しを少なくともif文の中に含める必要があります。 –

0

ありがとうございます!問題は、ルートノードが動的に割り当てられていないことです。 私は動的にルートを割り当てることになっていたかのように不確かだったので、私はこの単純な(ただし、非常にエレガントではない)修正を使用:

node* currentNodePtr = &root; 
bool unload(void) 
{ 
    node* ptrArray[27] = {NULL}; 

    for(int i = 0; i < 27; i++) 
    { 
     ptrArray[i] = currentNodePtr -> children[i]; 
    } 

    if(currentNodePtr != &root) 
    { 
     free(currentNodePtr); 
    } 


    for(int c = 0; c < 27; c++) 
    { 
     if(ptrArray[c] != NULL) 
     { 
      currentNodePtr = ptrArray[c]; 
      unload(); 
     } 

    } 

    return true; 
} 
関連する問題