c - "Bad permissions for mapped region at address"哈希表的 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->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/

相关文章:

java - 根据 Java 中传递的参数定义数据类型

c++ - Valgrind 在 ATI 上运行 opengl 程序时报告很多错误 - 我应该担心吗?

c - 摆脱基于文件的通信

C fread() 一个结构体

c - 使用无缓冲 IO 例程询问和读取用户输入

C++11 多线程 : Valgrind uninitialized value(s) warning

c - 大小为 1 的 Strcpy 读取无效

c# - C# 中 foreach() 的复杂性。网

java - 在java中使用什么集合来存储具有相同哈希码的多个对象?

c++ - 基于 C++ 中的值从 HashTable 中删除而不使用 STL