我是 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;
}
我收到以下错误:
==9243==
==9243== Process terminating with default action of signal 11 (SIGSEGV)
==9243== Bad permissions for mapped region at address 0x6018A4
==9243== at 0x4009CD: insertObject (encode.c:119)
==9243== by 0x4008E3: main (encode.c:55)
第119行是行
h->hash[i]=x;
有趣的是,当我通过调试器运行整个代码时,它在 90% 的时间里都能正常工作。但是,对于某些特殊情况,代码会出现段错误,调试器告诉我这也是罪魁祸首。怎么了?
最佳答案
错误是由于不正确的内存访问,基本上您的应用程序正在尝试访问未映射到其内存空间中的内存区域。
很可能 i
的值超出了哈希数组的限制。我不能更精确,因为我不知道散列函数是如何工作的,也不知道 perf
代表什么。
但是,在 10% 的应用程序无法运行的情况下,您应该使用调试器验证 i
的值。
附言一个程序应该在 100% 的时间内正常工作。
关于c - "Bad permissions for mapped region at address"哈希表的 Valgrind 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19239358/