作为练习(我是学生),我在C中实现了一个基本的string
到int
哈希表。我(我认为)一切正常,除了{{1} }。它开始工作,但Windows打印出一个桶的三个条目后,“hashtable.exe已停止工作”,我知道其他的有效,因为我可以在命令提示符下检索它们的值我有的东西。这是我的代码,任何建议都很重要:
print table function
答案 0 :(得分:0)
在分配变量之前,不能使用变量的值。在main
中,您将i
的值传递给scanf
,但尚未为其指定值。所以你传递scanf
一个垃圾地址,导致程序在scanf
试图在那个无意义的位置存储东西时崩溃。
答案 1 :(得分:0)
奇怪的是,你的程序编译并在我的系统上运行正常,即使是print_table()
函数,查找...对我来说运行正常。也就是说,你应该修复Adam指出的错误:将输入字符串存储在未定义的地址是一个严重的错误。
仅仅声明char *i;
将导致i
包含的地址等于该位置执行堆栈上的最后一个地址。换句话说,它可能是任何。因此,程序实际上有时可能在某些计算机上工作,有时则不工作,具体取决于i
是否恰好包含有效地址。这可能解释了为什么你的程序在我的计算机上工作,而不在你的计算机上工作。
相反,你可以写:
char i[128];
...和...
scanf("%s", i);
答案 2 :(得分:0)
这是修改过的代码,可以解释什么是错的(来自函数print_table
):
if ( t->arr[i] == NULL ) printf("%s\n", "Null bucket.");
// what happens when t->arr[i] == NULL ?
// e->string is a NULL pointer deference.
for ( e = t->arr[i]; e != NULL && e->string != NULL; e = e->next ) {
print_entry(e);
}
修正:
if ( t->arr[i] == NULL )
printf("%s\n", "Null bucket.");
else
for ( e = t->arr[i]; e != NULL && e->string != NULL; e = e->next ) {
print_entry(e);
}