【问题标题】:Initialization Valgrind Error初始化 Valgrind 错误
【发布时间】: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->tablex 给您带来了问题,然后再处理。
  • 您将内存分配给x,然后立即在for 循环中重新分配x,因此您正在泄漏内存。
  • 我的猜测是问题实际上出在HashSearch 之外。 key 绝对是空终止的吗? h->table 中的所有条目及其成员(posnextnum)是否都已初始化?
  • 那么您有几个嫌疑人可供阅读:keyh->sizeh->table,可能还有h。如上所述,您也有泄漏。
  • @user1710702 请问最后到底是什么?

标签: c data-structures hash initialization valgrind


【解决方案1】:

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

【讨论】:

  • 这解决了我的类似问题。我没有将哈希表中的变量初始化为 NULL。
【解决方案2】:

根据您对我们 cmets 的回复,您的问题似乎出在函数之外,并且函数中使用的其中一项未正确初始化。除此之外,在这段代码中,您确实存在内存泄漏:

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

您正在为x 分配内存,然后立即在for 循环中重新分配x,这可能是您的本意:

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

【讨论】:

    【解决方案3】:

    使用memset()清除内存或使用函数calloc()代替malloc()

    【讨论】:

    • 一般来说这是个好建议,但 x 会立即被重新分配,所以这不是 Valgrind 警告的原因(尽管它是内存泄漏)。此外,对复合数据类型使用其他形式的初始化通常会更好(memsetcalloc 都将所有内存位置设置为相同的值,这对于复杂结构可能没有意义)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多