2012-02-24 20 views
1

バイナリヒープをツリーとして実装しました。ツリーノードは次のようになっています。ノードの構築中にメモリ割り当てが失敗する

struct tree_node { 
    char* p_word; 
    int count; 
    struct tree_node* parent; 
    struct tree_node* p_left; 
    struct tree_node* p_right; 
}; 

すべてがchar *メンバーになるまでは完全に動作します。私はp_wordのメモリ空間を割り当てようとすると、実行時に 'Segmentation Fault'が発生します。

currはツリーに追加されるノードを表し、ルートはツリーのルートノードを表します。

どのようにメモリリークを引き起こすことなくこの問題を解決できますか?

答えて

0

ああは最終的に、私はそれを解決する有効なメモリブロックを返しません。問題は挿入機能の中にありました。整数パラメータをcharポインタに変換しようとしていたことが分かりました。これはデバッグの失敗です、私には恥です:)とにかく、皆さん、ありがとう。

0

strlen(tok)が陽性であることを確認する必要があります。それ以外の場合は、0バイトを割り当てようとします。 mallocは、0バイトの割り当てが成功したことを示すために、NULLを返します。その後、NULLポインタを参照解除してクラッシュします。これを克服する方法については、よく... p_wordがNULLであることをサポートするか、strlen(tok) + 1バイトを割り当てて、空の文字列にのみ\0を格納する必要があります。

0

問題はstrtok..Check "tok"であり、NULLで終了するかどうかを確認することができます。 strlenはnullで終わらない文字に対しては機能しません。また、strtokはトークン化の過程で文字列を変更することに注意してください。ループを開始する前にストリングを一時バッファーにコピーすることをお勧めします。 、tokが正しい文字列であることを、この strtok problem in calling

0

チェックを見てstrlen(tok)がneihter否定もridicoulously大(前のテストによって暗示することができます)とmallocが実際に(このテストに代わるをいくつかのメモリを返さないことであることを確認してください)。


そのfgetsのリターンを確認し、この

curr->p_word = (char*)malloc(sizeof(char) * (strlen(tok)+1)); 
strcpy(curr->p_word, tok); 
+0

実際には、** tok **は正しいですし、** strlen(tok)**は常に_non-null terminated_ tokの長さを返します。割り当てのために別の方法を試しましたが、代わりにパラメータとして255を入れてください。割り当てのために使用されていませんが、問題は引き続き発生します。 –

0
  1. を試し非NULLです。 NULLを返した場合、バッファは '\ 0'で終了しないことがあります。
  2. 'curr =(lpnode)malloc(sizeof(node));'の型が正しいことを確認してください。どのタイプですか?私は 'struct tree_node'を期待していました。
  3. 文字列のサイズはstrlen(tok)+ 1です。また、それはmallocを確認定義1.
  4. によるものではsizeof(char)に乗算する理由は、
関連する問題