C &引用;地址“处映射区域的权限不正确”;哈希表的Valgrind错误
我对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
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;