2017-10-28 23 views
0

を与えますpizqとpderがそれぞれ左と右の子であるバイナリツリーの実装であることが分かります。は、私は、コードのこの部分を持っている0

しかし、私は 'free()'が実際にメモリを解放し、ここでそれを見ることができないことを理解していたので、私はこれを投稿しています。あなたは、5という値のノードテストを作成してから解放してから、コンソールでinorderを歩くと、 '0'を出力して終了します。なぜ地獄は0を印刷していますか? if (p == NULL) returnというケースにまっすぐに行かず、何も印刷せずに終了してはいけませんか?私は間違って何をしていますか?

ここINORDER機能のための私のコードです:

void inorder(NODO *p) 
{ 
    if (p == NULL) return; 

    if(p->pizq != NULL) 
     inorder((p->pizq); 

    // Process root 
    printf("%d ", p->val); 

    if(p->pder != NULL) 
     inorder(p->pder); 
} 
+2

mallocキャストに関するhttps://stackoverflow.com/questions/605845/do-i-cast-the-result-of-mallocを参照してください。 –

+1

この質問は不完全です。 'NODO'とは何ですか? – alk

+0

@alk a struct ... –

答えて

4

free(ptr)はメモリptrポインタが指しているが、ptrはまだ解放されたメモリ位置を指し示すと、そのようなメモリへのアクセスは未定義の動作である割り当てを解除します。

チェックthis

この(free)関数は、ptr自体の値を変更しないので、同じ(現在無効な)場所を指していることに注意してください。

ので、ちょうどfree()を呼び出すと、適切な型の有効なオブジェクトを指していないポインタDangling Pointerを行います。

ptr = NULL; 

これはダングリングポインタのバグから保護します:free(ptr)NULLへのポインタを設定する練習をたどる呼び出した後

だから、あなたのケースでは、あなたがすべき -

free(test); 
test = NULL; 
+0

これを行う方法はありますか?私のinorder walkが実際に何かを印刷するのを避けるにはどうすればいいですか? 'printf("%d "、p-> val);'私には自然に見えない行。 –

+0

@DavidMerinos、Cでの関数へのすべてのパラメータは値によって渡されるので、関数が 'free(3)'に渡されたポインタを変更することはできません。解放した場所を指し続けますあなたが適切な措置を講じていない場合は、 –

2

あなたには、いくつかのポインタにfreeと呼ばれていたら、あなたはそのメモリゾーンに何かをすることはできません。だから、inorderに電話しないでください。の前にfreeと呼んでください。

プログラムにはundefined behaviorがあります。非常にscaredになります。したがって、その動作は予測不可能であり、説明することはできません(実装の詳細に何年も費やさない限り)。

私はいくつかのコンストラクタに似た機能を持つお勧めします。

NODE*create_leaf_node(int val); 
NODE*create_pair_node(NODE*left, NODE*right); 

と(free(n);を呼び出すことによって終了)(再帰的)デストラクタのような関数を書く:もちろん

void destroy_node(NODE*n); 

を、私が思いますあなたの質問にお答えしましたstruct nodoがあります。

typedef struct nodo NODE; 

あなたのテストプログラムを行う可能性があります:

NODE*ntest = create_pair_node(create_pair_node(create_leaf_node(1), 
               NULL), 
           create_leaf_node(3)); 
inorder(ntest); 
destroy_node(ntest), ntest = NULL; 

を(私は最後の文でcomma operatorを使用しています)

そして、すべての警告とデバッグ情報を使用してプログラムをコンパイルする(例えば、 gcc -Wall -Wextra -gGCC)。それを改善して警告を受けないようにする。 デバッガgdb(おそらくvalgrindのような他のツール)を使用します。

ところで、C you should not cast the result of mallocに...あなたは(perrorで)mallocが、その後hereのように、プログラムを終了する失敗し、いくつかのエラーメッセージを表示することを検討してください。

関連する問題