2012-01-28 1 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; 

호출 코드는이 feof()가하는 일에서 빚어진 혼란을 보이는

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

입니다. 이후에 EOF로 인해 읽기에 실패 할 때까지는 참값을 반환하지 않습니다. 따라서 마지막 반복에서는 fscanf() 호출이 실패하므로 n->word이 초기화되지 않습니다. 반환 값 fscanf()을 확인해야합니다. EOF에 도달하면 C 값 EOF을 반환합니다. 단일 필드가 성공적으로 변환되었음을 나타내는 값 1을 확인할 수도 있습니다.

+0

그러나 feof가 실패하면 노드 * n은 malloc되지 않습니다. 그런 다음 if 루프가이를 catch해야합니다. – kevin

+0

'feof()'는 읽기가 실패 할 때까지 true를 반환하지 않습니다. 그러나 코드가 실패한 읽기와 EOF를 확인하는 사이에 읽지 않은 값을 사용하려고 시도합니다. – FatalError