2014-11-08 1 views
0

에 따라 달라집니다조건부 점프 또는 이동 내가 내 코드의이 비트에 문제가 초기화되지 않은 값

unsigned long me_hash(MEntry *me, unsigned long size){ 
    unsigned long hashval=0; 
    int i=0; 
    for(i=0; me->surname[i];i++) hashval +=me->surname[i] + 28 * hashval;; 

    for(i=0; me->surname[i];i++){ 
     if(me->postcode[i]) { 
     hashval += me->postcode[i] + 28 * hashval; 
     } 
    } 
    hashval += me->house_number; 
    return (hashval%size); 
} 

그렇게하지 내가 Valgrind의이

==4480== Conditional jump or move depends on uninitialised value(s) 
==4480== at 0x8048EB7: me_hash (mentry.c:66) 
==4480== by 0x8048B3E: ml_lookup (mlist.c:91) 
==4480== by 0x80488D2: main (finddupl.c:43) 
==4480== 

입니다 실행할 때 내가받을 메시지 이 문제를 해결하는 방법을 알아야합니다. 당신이 나를 도울 수?

+3

'me-> surname [i];'또는'me-> postcode [i]'가 초기화되지 않았습니까? 사용하기 전에 인쇄하여보십시오. – gsamaras

답변

2

Conditional jump or move depends on uninitialised value(s)

이 Valgrind의에서 정말 좋은 정보입니다.

기본적으로 if 또는 for 조건은 초기화되지 않은 값 (들)에 의존한다고 말합니다. 예를 들어 for 루프의 조건이 참일 때마다 실행은 본문의 시작 부분으로 돌아갑니다.

즉, 메시지는 this 대답에서 말한 것처럼 초기화되지 않은 메모리에 액세스하고 있음을 의미합니다.

이 값은 me->surname[i] 또는 me->postcode[i]입니다. 사용하기 전에 인쇄하여 실제 쓰레기 값이 있는지 확인하십시오 (아마도 그렇게 될 것입니다).


는 초기화되지 않은 값의 출처를 추적해야하는 Valgrind의 옵션 --track-origins=yes을 사용합니다. 이렇게하면 속도가 느려지고 메모리가 더 많이 필요하지만 초기화되지 않은 값의 출처를 추적해야하는 경우 매우 유용 할 수 있습니다.

this 답변으로 제안됩니다.