C-丢失指针对象结构值

C-丢失指针对象结构值,c,pointers,struct,reset,ghosts-in-the-machine,C,Pointers,Struct,Reset,Ghosts In The Machine,**更新。对于那些答案不再有意义的人,我感到抱歉 所以我发现,无论我在数据对节点之后,在它执行之后,在这行上放置什么,这都是重置的时候!什么?: 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 = NUL

**更新。对于那些答案不再有意义的人,我感到抱歉

所以我发现,无论我在数据对节点之后,在它执行之后,在这行上放置什么,这都是重置的时候!什么?:

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

您的问题不是
平均值列表
函数。它返回零的唯一方法是如果表开始时有零个存储桶

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


您应该检查(或张贴?)调用堆栈的其余部分。另一方面,我推荐gdb作为一个很好的控制台调试器:)

您的问题不是
平均列表\u len
函数。它返回零的唯一方法是如果表开始时有零个存储桶

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


您应该检查(或张贴?)调用堆栈的其余部分。另一方面,我推荐gdb作为一个很好的控制台调试器:)

您使用的是整数除法(list\u count和table->bucket\u ct都是整数),因此您的结果将被截断,如果平均bucket list长度小于1.0,您将得到一个返回值0——如果哈希表中的bucket多于条目

由于您需要双重答案,因此使用双重划分更有意义:

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

很难判断发生了什么,因为您从未打印出
表的值
,也没有显示调用
插入的代码(它从中获取值)。但可能会发生一些事情

  • table
    是一个本地变量,因此一旦
    table
    失效(在代码中最后一次使用之后),编译器可能会将其放入寄存器中,并将该寄存器重新用于其他内容,在这种情况下,使用gdb在该点打印
    table
    可能会打印任何内容

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


您使用的是整数除法(list\u count和table->bucket\u ct都是整数),因此如果bucket list的平均长度小于1.0,则结果将被截断,如果哈希表中的bucket多于条目,则返回值为0

由于您需要双重答案,因此使用双重划分更有意义:

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

很难判断发生了什么,因为您从未打印出
表的值
,也没有显示调用
插入的代码(它从中获取值)。但可能会发生一些事情

  • table
    是一个本地变量,因此一旦
    table
    失效(在代码中最后一次使用之后),编译器可能会将其放入寄存器中,并将该寄存器重新用于其他内容,在这种情况下,使用gdb在该点打印
    table
    可能会打印任何内容

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


如果average_u-list_-len函数没有更改传递给它的指针的内容,请将其定义为使用指向常量数据的指针:
double average_-list_-len(const Table*Table)
并让编译器帮助您验证函数的工作。在调用该函数之前,您确定它不是零吗?你的链接列表绝对正确吗?(即,您是否确认它们没有无意中指向随机内存位?)如果average_-list_-len函数没有更改传递给它的指针的内容,请将其定义为使用指向常量数据的指针:
double average_-list_-len(常量表*表)
并让编译器帮助您验证函数的工作方式。您确定在调用函数之前它不是零吗?你的链接列表绝对正确吗?(即,您是否确认他们没有无意中指向随机内存位?)。谢谢你的详细解释。我找到了,悬着的指针。谢谢你的详细解释。我找到了。