1

**更新しました。答えが意味をなさない人には申し訳ありません。

そのため、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

ありがとうエイモン・フルニエ

4

2 に答える 2

1

整数除算 (list_count と table->bucket_ct の両方が int) を使用しているため、平均バケット リスト長が 1.0 未満の場合、結果は切り捨てられ、戻り値 0 が返されます。エントリよりも多くのバケットがハッシュ テーブルにあります。

二重の答えが必要なので、二重除算を使用する方が理にかなっています。

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

編集

table値を出力したり、呼び出すコードinsert(値を取得する場所) を表示したりすることは決してないため、何が起こっているのかを伝えるのは困難です。しかし、いくつかのことが起こっている可能性があります。

  • tableローカル変数であるため、コンパイラはそれをレジスタに入れ、そのレジスタを別のものに再利用する可能性がありますtable(コードで最後に使用した後) table。何でも印刷します。

  • スタックへのダングリング ポインター (ローカル変数のアドレスを返した別の関数からのもの) の場合table、他のローカル変数に使用されるメモリを指している可能性があります。その場合、それらのローカル変数に代入すると値が変更されます。のtable->buckets

于 2010-10-16T01:32:10.167 に答える
0

あなたの問題はaverage_list_len機能ではありません。ゼロを返す唯一の方法は、最初からテーブルにゼロのバケットがある場合です。

関数insertのコードは、テーブルの値を変更しないことを示しているため、insert関数が呼び出された時点でテーブルのバケットはゼロであると言えます。

残りのコール スタックを検査 (または投稿) する必要があります。余談ですが、素晴らしいコンソール デバッガーとして gdb をお勧めします :)

于 2010-10-16T00:54:13.217 に答える