C - Потеря значений структуры pointee - PullRequest
1 голос
/ 16 октября 2010

** Обновлено. Извините тем, чьи ответы больше не имеют смысла.

Итак, я понял, что независимо от того, что я положил в строку после 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

Спасибо Аймон Фурнье

Ответы [ 2 ]

1 голос
/ 16 октября 2010

Вы используете целочисленное деление (и list_count, и table-> bucket_ct являются целыми числами), поэтому ваш результат будет усечен, и вы получите возвращаемое значение 0, если средняя длина списка сегментов меньше 1,0 - если в хеш-таблице больше сегментов, чем записей.

Поскольку вам нужен двойной ответ, имеет смысл использовать двойное деление:

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

редактировать

Трудно сказать, что происходит, так как вы никогда не печатаете значение table или не показывает код, который вызывает insert (где он получает свое значение). Но пара вещей может происходить.

  • table - это локальная переменная, поэтому компилятор может поместить ее в регистр и повторно использовать этот регистр для чего-то другого, когда table мертв (после последнего использования в коде), в этом случае печать table в этот момент (или все, что зависит от него) с помощью gdb может напечатать что угодно.

  • , если table является висящим указателем в стеке (он исходит от другой функции, возвращающей адрес локальной переменной), он вполне может указывать на память, используемую для некоторых других локальных переменных, и в этом случае присвоение этим локальным переменным изменит значение table->buckets

0 голосов
/ 16 октября 2010

Ваша проблема не в функции average_list_len.Единственный способ вернуть ноль - это если в начале таблицы есть нулевые сегменты.

Код вашей функции insert показывает, что вы не изменяете значения таблицы, поэтому я бы сказал, что ваша таблица имеет нулевые сегменты в момент вызова функции insert.

Вы должны проверить (или опубликовать?) Остальную часть стека вызовов.Кстати, я рекомендую GDB как хороший консольный отладчик:)

...