我的代码有点问题:
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==
我不知道如何解决这个问题。你能帮帮我吗?
答案 0 :(得分: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回答中建议。