【问题标题】:Array pointer always points to NULL数组指针总是指向 NULL
【发布时间】:2019-02-18 02:22:13
【问题描述】:

我正在尝试在节点数组中创建一个链表。当我尝试将 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;
}

【问题讨论】:

  • 版主注意:请不要破坏您的帖子。一旦您发布问题,它们就属于该网站及其用户。即使它不再对您有用,它也可能对将来的某人有所帮助。回答者也会努力写下他们的答案,如果您从帖子中删除了内容,这将不再有用。另外,请注意,通过在 Stack Exchange 网络上发布,您已授予 SE 分发该内容的不可撤销的权利(根据 CC BY-SA 3.0 许可)。根据 SE 政策,任何破坏行为都将被撤销。

标签: c


【解决方案1】:

我不能确定为什么指针总是指向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;

symbol_searchhashindex 参数似乎被计划为输出参数。在这种情况下,请注意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 很奇怪。给定链表中的每个节点都具有相同的散列(检查如何添加它们)。即使名称不同,第一个节点也会产生匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2016-07-30
    • 1970-01-01
    相关资源
    最近更新 更多