1

**更新。对不起那些答案不再有意义的人。

所以我发现无论我在Data_pair_node之后放什么,在它执行之后,那就是东西被重置的时候!什么?:

int insert(Table *t, const char *key, const char *val){
 int dest_bucket_index;
 Table *table = t;
 Hash_bucket *dest_bucket = NULL;
 Data_pair_node *current = NULL, *prev = NULL, *new_item = NULL;

 printf("gonna be zero now");

瞧:

$23 = (Hash_bucket *) 0x834010
(gdb) step
109  printf("gonna be zero now");
(gdb) print table->buckets
$24 = (Hash_bucket *) 0x0

谢谢艾蒙·福尼耶

4

2 回答 2

1

您正在使用整数除法(list_count 和 table->bucket_ct 都是整数),因此您的结果将被截断,如果平均桶列表长度小于 1.0,您将获得返回值 0 - 如果您有哈希表中的桶多于条目。

由于您想要双重答案,因此使用双重除法更有意义:

ret = (double)list_count / table->bucket_ct;

编辑

很难说出发生了什么,因为您从不打印出调用的值table或显示调用的代码insert(这是它获取值的地方)。但有几件事可能正在发生。

  • tabletable是一个本地变量,因此编译器可能会将它放在一个寄存器中,并在该寄存器失效后(在代码中最后一次使用之后)重用该寄存器,在这种情况下table,使用 gdb 在该点打印(或任何取决于它的东西)可能打印任何东西。

  • iftable是指向堆栈的悬空指针(它来自另一个返回局部变量地址的函数),它很可能指向用于其他一些局部变量的内存,在这种情况下,分配给这些局部变量会改变值的table->buckets

于 2010-10-16T01:32:10.167 回答
0

你的问题不是average_list_len功能。它返回零的唯一方法是该表是否从零开始。

您的insert函数代码显示您没有修改表的值,所以我会说您的表在insert调用函数时有零桶。

您应该检查(或发布?)调用堆栈的其余部分。顺便说一句,我推荐 gdb 作为一个不错的控制台调试器 :)

于 2010-10-16T00:54:13.217 回答