C &引用;地址“处映射区域的权限不正确”;哈希表的Valgrind错误

C &引用;地址“处映射区域的权限不正确”;哈希表的Valgrind错误,c,hashtable,valgrind,C,Hashtable,Valgrind,我对C相当陌生。当我在Valgrind下为哈希表运行以下代码时: table *insertObject (table *h, int pref, char ch) { struct node x; int i; if (ch < 0) { ch=256-ch; } x.chr=ch; x.pref=pref; i = hash(pref, ch, h->size); while (h->h

我对C相当陌生。当我在Valgrind下为哈希表运行以下代码时:

table *insertObject (table *h, int pref, char ch)
{
    struct node x;
    int i;
    if (ch < 0)
    {
        ch=256-ch;
    }
    x.chr=ch;
    x.pref=pref;
    i = hash(pref, ch, h->size);
    while (h->hash[i].pref!=0)
    {
        i++;
    }
    h->hash[i]=x;
    h->size++;
    return h;
}
119号线就是这条线

 h->hash[i]=x;

有趣的是,当我通过调试器运行整个代码时,90%的时间都可以正常工作。然而,对于某些特殊情况,代码会出错,调试器告诉我这也是罪魁祸首。怎么了?

错误是由于不正确的内存访问造成的,基本上,您的应用程序正在尝试访问未映射到其内存空间的内存区域

i
的值很可能超过哈希数组的限制。我不能说得更精确,因为我不知道哈希函数是如何工作的,也不知道
perf
代表什么。 但是,在应用程序不工作的10%情况下,您应该使用调试器验证
i
的值


另外,一个程序应该在100%的时间内正常运行

那一点也不好笑。欢迎使用编程;)从表中删除对象时,是否确实总是正确清理哈希表条目。
 h->hash[i]=x;