2014-11-08 1 views
0

내 프로그램에서 메모리 누수를 해결하려고했습니다. 이것에 어떤 도움이 정말 정말 이해할 수있을 것이다조건부 점프 또는 이동은 valgrind를 사용하여 초기화되지 않은 값에 따라 달라집니다.

==7853== Conditional jump or move depends on uninitialised value(s) 
==7853== at 0x40116D: me_hash (in /home/iva/University/AdvProg/Assessed/a.out) 
==7853== by 0x400D7A: ml_lookup (in /home/iva/University/AdvProg/Assessed/a.out) 
==7853== by 0x4013CD: main (in /home/iva/University/AdvProg/Assessed/a.out) 

: 나는 Valgrind의를 실행할 때

unsigned long me_hash(MEntry *me, unsigned long size) { 

    unsigned long hash; 
    unsigned long hash_init; 
    int i; 

    hash = 0; 
    hash_init = 0; 

    for (i = 0; me -> surname[hash_init] != '\0'; i++) { 
     hash_init += (int) me -> surname[i]; 
    } 

    hash += 5381*hash_init; 

    for (i = 0, hash_init = 0; me -> postcode[hash_init] != '\0'; i++) { 
     hash_init += (int) me -> postcode[i]; 
    } 

    hash_init = hash_init + me -> house_number; 

    hash += 5381*hash_init; 

    hash = hash%size; 

    return hash; 
} 

이 내 터미널에 인쇄 된 결과입니다 :이 오류를 발생시키는 코드의 조각이다.

+0

-g로 컴파일 했습니까? –

+0

먼저 gcc -W program.c로 컴파일했습니다. 그런 다음 valgrind --tool = memcheck --track-origins = yes --leak-check = full --read-var-info = yes -v ./a를 사용했습니다. out – Iva

+0

valgrind의 출력에서 ​​줄 번호를 얻으려면'-g' (와'-Wall -Wextra -std = c99')를 추가하십시오. – Mat

답변

1
for (i = 0; me -> surname[hash_init] != '\0'; i++) { 
    hash_init += (int) me -> surname[i]; 
} 

위의 루프 상태가 잘못되었습니다. 아마도 다음과 같아야합니다.

for (i = 0; me -> surname[i]; i++) { 
    hash_init += (int) me -> surname[i]; 
} 

두 번째 루프와 동일한 문제입니다.

+0

나는 그것을 고쳤다, 나는 왜 그것을 더 일찍 발견하지 못했는지 모른다, 그것은 아주 명백하다 ... 고맙다. :) – Iva