Указатель массива всегда указывает на NULL - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь создать связанный список в массиве узлов.Когда я пытаюсь обновить указатель для arrTab-> h_table [index] на адрес newNode, адрес указывает на адрес newNodes.Но когда я пытаюсь добавить в список, который существует в массиве, указатель всегда указывает на NULL вместо предыдущего значения в памяти.Обычно заголовок связанного списка arrTab-> h_table [index] не обновляется до адреса newNode.

typedef struct node {
  struct node* next;     
  int          hash;     
  s_type     symbol;
} node_t;


struct array {
  int      cap;    
  int      size;       
  n_type** h_table;
};



int add_to_array (array* arrTab, const char* name, int address) {
  if(s_search(arrTab, name, NULL, NULL) == NULL){
    s_type *symbol = (s_type*) calloc(1, sizeof(s_type));
    symbol->name = strdup(name);
    symbol->addr = addr;
    n_type  *newNode = (n_type*) calloc(1, sizeof(n_type));
    newNode->next = NULL;
    newNode->hash = nameHash(name);
    newNode->symbol = *symbol;
    int index = newNode->hash % arrTab->cap;
    if(arrTab->h_table[index] == NULL){
      arrTab->h_table[index] = newNode;
    } else {
      newNode->next = arrTab->h_table[index];
      arrTab->h_table[index] = newNode;
    }
    //
    arrTab->size++;
    return 1;
  }
  return 0;
}

struct node* s_search (array* arrTab, const char* name, int* hash, int* index) {
  int hashVal = nameHash(name);
  hash = &hashVal;
  int indexVal = *hash % arrTab->cap;
  index = &indexVal;
  s_type *symCopy = arrTab;
  while (symCopy->h_table[*index] != NULL){
    if(*hash == symCopy->h_table[*index]->hash){
      return symCopy->h_table[*index];
    }
    symCopy->h_table[*index] = symCopy->h_table[*index]->next;
  }
  return NULL;
}

1 Ответ

0 голосов
/ 18 февраля 2019

Не могу с уверенностью сказать, почему указатель всегда указывает на 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 странно.Каждый узел в данном связанном списке имеет одинаковый хэш (проверьте, как вы их добавляете).Самый первый узел даст совпадение, даже если имена разные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...