【发布时间】:2013-04-12 08:25:25
【问题描述】:
此函数是哈希表的一部分。我正在传递一个要搜索的哈希列表和一个键。
int HashSearch (Hash_list h, char* key)
{
struct ent *x = (struct ent *)malloc(10*sizeof(struct ent));
for (x = h->table[hash(key, h->size)]; x!=0; x=x->next) {
if (strcmp(x->pos, key)==0) {
return x->num;
}
}
return -1;
}
不幸的是,当我尝试运行它时,valgrind 一直给我错误
==1741== Conditional jump or move depends on uninitialised value(s)
==1741== at 0x4018DE: HashSearch (Hash.c:81)
==1741== by 0x400FA7: function (Nine13.c:181)
==1741== by 0x4009D8: main (Nine13.c:54)
==1741==
==1743== Conditional jump or move depends on uninitialised value(s)
==1743== at 0x4018DE: HashSearch (Hash.c:81)
==1743== by 0x400FA7: function (Nine13.c:181)
==1743== by 0x4009D8: main (Nine13.c:54)
==1743==
(第 81 行是以“for”开头的代码行)。
我觉得我已经初始化了struct ent 和传入的哈希列表。怎么了?
【问题讨论】:
-
将您的 for 拆分为 sep。位,以便您查看是
h->table或x给您带来了问题,然后再处理。 -
您将内存分配给
x,然后立即在for循环中重新分配x,因此您正在泄漏内存。 -
我的猜测是问题实际上出在
HashSearch之外。key绝对是空终止的吗?h->table中的所有条目及其成员(pos、next和num)是否都已初始化? -
那么您有几个嫌疑人可供阅读:
key、h->size、h->table,可能还有h。如上所述,您也有泄漏。 -
@user1710702 请问最后到底是什么?
标签: c data-structures hash initialization valgrind