0

该函数是哈希表的一部分。我正在传递一个要搜索的哈希列表和一个键。

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传入的哈希列表和哈希列表。怎么了?

4

3 回答 3

2

基于this other question,问题似乎确实是并非所有条目h->table都已初始化。请注意,虽然使用callocor memsetontable很有可能解决问题,但从技术上讲,它是不可移植的。虽然0保证评估等于空指针,但不保证位模式都是0s。此外,正如在另一个线程和我上面的评论中指出的那样,对于复杂的数据类型,您通常需要一些其他“空”值。

于 2013-04-20T05:19:27.443 回答
1

从您对我们评论的回复来看,您的问题似乎在函数之外,并且函数中使用的项目之一未正确初始化。除此之外,您确实有内存泄漏,在这段代码中:

struct ent *x = (struct ent *)malloc(10*sizeof(struct ent));
           ^^
  for (x = h->table[hash(key, h->size)]; x!=0; x=x->next) {
       ^^^^^

您正在分配内存x,然后立即xfor循环中重新分配,可能这就是您要执行的操作:

struct ent *x ;
  for (x = h->table[hash(key, h->size)]; x!=0; x=x->next) {
于 2013-04-19T09:13:56.200 回答
0

用于memset()清除内存或使用该功能calloc()代替malloc()

于 2013-04-19T04:04:28.573 回答