**更新。对那些答案不再合理的人表示抱歉。
所以我发现无论我在Data_pair_node之后放在线上,在执行之后,那就是重置的东西! WTH? :
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
由于 Aymon Fournier
答案 0 :(得分:1)
您正在使用整数除法(list_count和table-> bucket_ct都是整数),因此您的结果将被截断,如果平均存储区列表长度小于1.0,您将获得返回值0 - - 如果哈希表中的桶数多于条目。
由于您需要双重答案,因此使用双重除法更有意义:
ret = (double)list_count / table->bucket_ct;
修改强>
很难说出你发生了什么,因为你从来没有打印出table
的值或者显示调用insert
的代码(这是它得到它的值)。但是可能会发生一些事情。
table
是一个本地var,所以编译器可能会把它放在一个寄存器中,并在table
死后(在代码中最后一次使用之后)重新使用该寄存器。使用gdb打印table
在哪一点(或任何取决于它)的情况可能会打印任何内容。
如果table
是指向堆栈的悬空指针(它来自另一个返回局部变量地址的函数),它可能指向用于某些其他本地变量的内存,分配给这些本地变量的情况将更改table->buckets
答案 1 :(得分:0)
您的问题不是average_list_len
功能。它返回零的唯一方法是表是否有零桶开始。
你的insert
函数的代码显示你不修改表的值,所以我说你的表在调用insert
函数时没有桶。
您应该检查(或发布?)调用堆栈的其余部分。另外,我建议将gdb作为一个不错的控制台调试器:)