Не могу с уверенностью сказать, почему указатель всегда указывает на NULL ;недостаточно кодаПодумайте о публикации MCVE .
Однако опубликованный код представляет несколько проблем для решения.
Во-первых, утечка памяти, как будто завтра нет:
symbol_t *symbol = (symbol_t*) calloc(1, sizeof(symbol_t));
выделяет часть памяти, а
newNode->symbol = *symbol;
копирует содержимое этой памяти в новое место.Распределенная память все еще существует и продолжает существовать после возврата из функции, но нет никакого способа добраться до нее.Я настоятельно рекомендую не выделять symbol
и работать напрямую с newNode->symbol
:
newNode->symbol.name = strdup(name);
newNode->symbol.addr = addr;
Параметры hash
и index
для symbol_search
кажутся запланированнымив качестве выходных параметров.В этом случае обратите внимание, что результаты hash = &hashVal;
и index = &indexVal;
невидимы для вызывающей стороны.Вы, вероятно, имели в виду *hash = hashVal
и *index = indexVal
.
Самая большая проблема возникает с sym_table_t *symCopy = symTab;
.
symTab
- указатель.Это указывает на фактическую таблицу символов, большой кусок памяти.После назначения symCopy
указывает на тот же фрагмент памяти.Это означает, что
symCopy->hash_table[*index] = symCopy->hash_table[*index]->next;
изменяет этот фрагмент памяти .Как только поиск завершен, hash_table[index]
уже не тот, что был до поиска.Это может быть корнем вашей проблемы.В любом случае, рассмотрите
node_t * cursor = symTab->hash_table[*index];
и поработайте с этим курсором.
В качестве примечания, условие поиска *hash == symCopy->hash_table[*index]->hash
странно.Каждый узел в данном связанном списке имеет одинаковый хэш (проверьте, как вы их добавляете).Самый первый узел даст совпадение, даже если имена разные.