Ваша проблема в функции HTCreate
: она возвращает &table
, который является локальным для функции.
Демо-версия:
HTHash *HTCreate(void)
{
int i;
HTHash table = NULL;
printf("&table before malloc: %p\n", &table);
table = malloc(TABLESIZE*sizeof(TableEntry));
printf("&table after malloc: %p\n", &table);
HTHash *T;
for(i=0;i<TABLESIZE;i++)
table[i].head = NULL;
T = &table;
return T;
}
Напечатает:
&table before malloc: 0x7fff200eb818
&table after malloc: 0x7fff200eb818
Мы видим, что malloc
не влияет на это значение.
Поскольку это локально для функции, использование этой функции в другой функции может вызвать что угодно (неопределенное поведение)
Хороший способ вернуть то, что вам нужно из функции, - это вернуть HTHash
тип:
HTHash HTCreate(void)
{
int i;
HTHash table = malloc(TABLESIZE*sizeof(TableEntry));
for(i=0;i<TABLESIZE;i++)
table[i].head = NULL;
return table;
}
Посмотрев, что в нем сделано, я увидел, что эту функцию можно упростить:
HTHash HTCreate(void)
{
return calloc(TABLESIZE, sizeof(TableEntry));
}