C - 丢失指针结构值

时间:2010-10-16 00:29:33

标签: c pointers struct reset ghosts-in-the-machine

**更新。对那些答案不再合理的人表示抱歉。

所以我发现无论我在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

2 个答案:

答案 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作为一个不错的控制台调试器:)