Помимо возможности того, что значения в вашем htable
могут быть недопустимыми указателями (т. Е. Ни NULL, ни указателем на приличную строку C), у вас есть серьезная проблема с бесконечным циклом если он не содержит ни NULL, ни искомой строки.
Для немедленной проблемы попробуйте изменить код на:
#define FLUSH fflush (stdout); fsync (fileno (stdout))
int linear_probe (htable h, char *item, int k) {
int pos = k;
do {
pos = (pos + 1) % h->capacity;
printf ("========\n"); FLUSH;
printf ("inpk: %d\n", k); FLUSH;
printf ("posn: %d\n", pos); FLUSH;
printf ("cpct: %d\n", h->capacity); FLUSH;
printf ("keyp: %p\n", h->keys[pos]); FLUSH;
printf ("keys: '%s'\n", h->keys[pos]); FLUSH;
printf ("item: '%s'\n", item); FLUSH;
printf ("========\n"); FLUSH;
} while ((pos != k)
&& (h->keys[pos] != NULL)
&& (strcmp (h->keys[pos], item) != 0));
return pos;
}
Эти операторы отладки должны дать вам представление о том, что идет не так.
Так как вы получаете:
inpk: -2055051140
posn: -30
cpct: 113
keyp: 0x100000001
прямо перед сбоем очевидно, что кто-то передает поддельное значение для k
. Операция по модулю отрицательных чисел является реализацией, определенной в стандарте C, поэтому вы также получаете отрицательное значение для pos
. А поскольку h->pos[-30]
будет неопределенным поведением, все ставки сняты.
Либо найдите и исправьте код, передающий это поддельное значение (возможно, неинициализированную переменную), либо защитите свою функцию, изменив:
int pos = k;
в:
int pos;
if ((k < 0) || (k >= h->capacity))
k = 0;
pos = k;
в начале вашей функции. Я бы на самом деле сделал и то и другое, но тогда я довольно параноик: -)
И, основываясь на еще другом обновлении (вычисление хеш-ключа, если вы сгенерируете unsigned int
и затем вслепую используете его как int
со знаком, у вас есть хороший шанс получить отрицательные значения:
#include <stdio.h>
int main (void) {
unsigned int x = 0xffff0000U;
int y = x;
printf ("%u %d\n", x, y);
return(0);
}
Это выводит:
4294901760 -65536
Я предлагаю использовать целые числа без знака для значений, которые явно предназначены для беззнаковых.