繁体   English   中英

C-丢失pointe结构值

[英]C - Losing pointee struct values

**更新。 抱歉,那些答案不再有意义。

因此,我想出了无论我在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

谢谢艾蒙·弗尼尔

您使用整数除法(list_count和table-> bucket_ct均为整数),因此结果将被截断,并且如果平均存储桶列表长度小于1.0,则返回值为0,如果哈希表中的存储桶多于条目。

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

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

编辑

很难说出是怎么回事,因为您永远不会打印出table的值或显示调用insert的代码(从那里获取它的值)。 但是可能会发生一些事情。

  • table是一个本地变量,因此编译器可能会将其放在寄存器中,并在table死掉之后(在代码中的最后一次使用之后)将该寄存器重用于其他用途,在这种情况下,此时将打印table (或其他取决于table )与gdb可能会打印任何内容。

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

您的问题不是average_list_len函数。 它返回零的唯一方法是表开头有零个存储桶。

您的insert函数的代码显示您没有修改表的值,因此我想说在调用insert函数时您的表的存储桶为零。

您应该检查(或发布?)其余的调用堆栈。 附带说明一下,我建议将gdb作为一个不错的控制台调试器:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM