初始化Valgrind错误

时间:2013-04-19 02:25:30

标签: c data-structures hash initialization valgrind

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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分配内存,然后立即在x循环中重新分配for,这可能是您的意图:

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

答案 2 :(得分:0)

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