2012-01-28 47 views
0

我從valgrind獲得以下錯誤。條件跳轉或移動取決於未經初始化的值。我環顧了類似的問題,但我無法找出什麼是錯的。我已初始化所有變量,但仍然..有條件跳轉或移動取決於unininitalized值

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的值從主函數傳遞。我正在使用leak-check = full和track-origins = yes。先謝謝您的幫助。

首先我正在初始化一個節點。

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 2012-01-28 17:38:46

回答

3

這看起來像什麼feof()做一個誤區。在由於EOF而導致讀取失敗後,它不會返回真值,直到。因此,在上次迭代中,fscanf()調用失敗,因此不會初始化n->word。您應該檢查fscanf()的返回值。如果它擊中EOF,則返回C值EOF。您還可以檢查值1,指示單個字段已成功轉換。

+0

但是如果feof失敗,那麼node * n將不會被malloc'd。然後if循環應該捕獲它。 – kevin 2012-01-28 17:52:18

+0

'feof()'直到讀取失敗後才返回true。但是,在代碼使讀取失敗並檢查EOF之間,它會嘗試使用它(未讀取)的值。 – FatalError 2012-01-28 17:57:08

相關問題