输出trie.dot时中止(核心转储)

时间:2013-12-13 20:02:40

标签: c

运行我应该输出trie.dot文件的trie.o时出现此错误,因此它只输出一个单词而不是整个字典。它从dictionary.txt获取输入。我不能把我的完整代码放在这里,因为它是一个学校作业,这就是为什么我试图搜索错误发生的地方,我认为它在我的代码的插入函数中出现。

在我搜索错误时,我了解到这个错误通常与内存有关(特别是malloc和free()),但我在代码中找不到错误。

错误

  *** Error in `./output.o': free(): invalid pointer: 0xb77b5470 ***
  ======= Backtrace: =========
 /lib/i386-linux-gnu/libc.so.6(+0x767e2)[0xb767c7e2]
 /lib/i386-linux-gnu/libc.so.6(+0x77530)[0xb767d530]
 ./output.o[0x80487fd]
 ./output.o[0x804876e]
  /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0xb761f935]
 ./output.o[0x8048641]
  ======= Memory map: ========
 08048000-0804a000 r-xp 00000000 08:01 922197     /home/jordy/Desktop/Practicum/output.o
 0804a000-0804b000 r--p 00001000 08:01 922197     /home/jordy/Desktop/Practicum/output.o
 0804b000-0804c000 rw-p 00002000 08:01 922197     /home/jordy/Desktop/Practicum/output.o
 09ee9000-09f0a000 rw-p 00000000 00:00 0          [heap]
 b75d6000-b75f1000 r-xp 00000000 08:01 394080     /lib/i386-linux-gnu/libgcc_s.so.1
 b75f1000-b75f2000 r--p 0001a000 08:01 394080     /lib/i386-linux-gnu/libgcc_s.so.1
 b75f2000-b75f3000 rw-p 0001b000 08:01 394080     /lib/i386-linux-gnu/libgcc_s.so.1
 b7605000-b7606000 rw-p 00000000 00:00 0 
 b7606000-b77b3000 r-xp 00000000 08:01 394055     /lib/i386-linux-gnu/libc-2.17.so
 b77b3000-b77b5000 r--p 001ad000 08:01 394055     /lib/i386-linux-gnu/libc-2.17.so
 b77b5000-b77b6000 rw-p 001af000 08:01 394055     /lib/i386-linux-gnu/libc-2.17.so
 b77b6000-b77b9000 rw-p 00000000 00:00 0 
 b77c9000-b77cd000 rw-p 00000000 00:00 0 
 b77cd000-b77ce000 r-xp 00000000 00:00 0          [vdso]
 b77ce000-b77ee000 r-xp 00000000 08:01 394031     /lib/i386-linux-gnu/ld-2.17.so
 b77ee000-b77ef000 r--p 0001f000 08:01 394031     /lib/i386-linux-gnu/ld-2.17.so
 b77ef000-b77f0000 rw-p 00020000 08:01 394031     /lib/i386-linux-gnu/ld-2.17.so
 bfeb6000-bfed7000 rw-p 00000000 00:00 0          [stack]
 Aborted (core dumped)

1 个答案:

答案 0 :(得分:0)

据我所知,

int trie_is_valid_key(const char* key)
{
    int i=0;
    while(i<=sizeof(key)){
        if('a'<= key[i] && key[i] <= 'z'){
            i++;
        }
        else return 0;
    }
    return 1;
}

将始终返回0,因为您将在某个时刻遇到NUL字节。您 可能想要

   while (i<strlen(key))

由于trie_is_valid_key始终返回0,trie_insert始终会执行

free(trie -> value);

可能会尝试释放NULL指针,从而导致来自free的错误消息。 你可能想要

if(trie->value) {
    free(trie->value);
}

但是我不确定你是否曾经遇到过任何空指针,所以请检查你的算法以确保你真的想要替换该trie节点中的现有值。

此外,TRIE_NB_CHILDREN至少是26?如果没有,程序可能会在trie->children数组的范围之外写入,从而废弃trie->value