运行我应该输出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)
答案 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
。