哈希表打印“停止工作”

时间:2013-12-16 01:04:06

标签: c hashtable

作为练习(我是学生),我在C中实现了一个基本的stringint哈希表。我(我认为)一切正常,除了{{1} }。它开始工作,但Windows打印出一个桶的三个条目后,“hashtable.exe已停止工作”,我知道其他的有效,因为我可以在命令提示符下检索它们的值我有的东西。这是我的代码,任何建议都很重要:

print table function

3 个答案:

答案 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);
    }