2010-10-16 85 views
1

**已更新。对于那些答案不再有意义的人抱歉。C - 丢失指针结构值

所以我想通了,不管我在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福尼尔

+0

值,将其定义为采用指针为const数据:'双average_list_len(常量表*表)'并让编译器帮助您验证函数的工作。 – pmg 2010-10-16 00:35:46

+0

您确定它在调用函数之前不是零*吗?你的链表是否正确? (即,你确认他们不会无意中指向随机位的内存?) – 2010-10-16 00:38:38

回答

1

你正在使用整数除法(list_count和table-> bucket_ct都是整数),所以你的结果将被截断,你会得到一个如果平均桶列表长度小于1.0,则返回值为0 - 如果散列表中有多个桶比条目多。

既然你想有一个双答复,它更有意义,使用双分:

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

编辑

这很难知道发生了什么事情,你永远不会打印出的值table或显示调用insert(这是它的价值)的代码。但有几件事情可能正在发生。

  • table是一个局部变量,因此编译器可能把它放在了别的东西一旦table是死的(在代码中最后使用后)登记注册和再利用,在这种情况下,在这一点上打印table (或任何取决于它的)与gdb可能会打印任何东西。

  • 如果table是悬空指针入堆栈(它来自该返回的局部变量的地址的另一功能),它很可能会在用于一些其他本地变量存储器被指向,在这种情况下,分配给那些如果您average_list_len功能是不会改变传递给它的指针的内容,本地变量将改变table->buckets

+0

摇晃的指针。感谢您的详细解释。我找到了。 – 2010-10-16 18:19:37

0

你的问题不在于average_list_len功能。它返回零的唯一方法是如果该表有零桶开始。

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

您应该检查(或张贴?)其余的调用堆栈。在旁注中,我建议gdb作为一个很好的控制台调试器:)

+0

我发现它没有在那里发生,并用gdb发布我的更新问题。 – 2010-10-16 03:34:06