2012-01-28 5 views
0

valgrindから次のエラーが発生しています。条件ジャンプまたは移動は、初期化されていない値に依存します。私は似たような質問を見回しましたが、何が間違っているかを知ることはできません。私はすべての変数を初期化しましたが、まだ..条件付きジャンプまたは移動はユニオン化されていない値に依存します

unsigned long hash_word(const char *str) 
{ 
    unsigned long hash = 5381; 
    int c = 0; 

    while((c = *str)) // The error occurs here 
    { 
    hash = ((hash<<5) + hash) + c; 
    str++; 
    } 

return hash%1999099; 
} 

strの値はmain関数から渡されます。私は、リークチェック=フルとトラック・オリジン=はいを使用しています。助けを前にありがとう。

最初にノードを初期化しています。

typedef struct node{ 
    char word[46]; 
    struct node *next; 
    } node; 

呼び出し元のコードが

while(!(feof(fp))) 
{ 
    node *n = malloc(sizeof(node)); 
    if (n == NULL) 
    { 
    return false; 
    } 
    else 
    { 
    fscanf(fp,"%s",n->word); 

    index = hash_word(n->word); 
    . 
    . 
    . // further code 
    } 
+1

'str'はどのように入手できますか?私たちに発信者コードを表示してください。 – cnicutar

答えて

3

ですこれはfeof()が何をするかで誤解のように見えます。 の後に真の値を返しません。の後、EOFのために読み込みに失敗しました。したがって、最後の反復では、fscanf()呼び出しが失敗し、したがってn->wordが初期化されません。戻り値はfscanf()であることを確認してください。 EOFに当たった場合は、Cの値EOFを返します。また、1つのフィールドが正常に変換されたことを示す値1を確認することもできます。

+0

しかし、feofが失敗すると、node * nはmallocされません。その後、ifループはそれを捕らえるべきです。 – kevin

+0

'feof()'は、読み込みが失敗するまでtrueを返しません。しかし、コードが失敗した読み取りとEOFのチェックを行う間に、読み取られなかった値を使用しようとします。 – FatalError

関連する問題