【问题标题】:Segmentation Fault with Hash Tables哈希表的分段错误
【发布时间】:2016-03-03 04:42:56
【问题描述】:

我正在尝试更准确地创建一个哈希表,一个链表数组,我已经为链表使用了 add 函数并且工作正常,但是在尝试对哈希表进行此操作时会产生分段错误。

void create_HTable(FILE* book, list* hashTable[1009])
{
  char word[20];
  read(word,book);
  while(strcmp(word,"EOF")!=0)
  {
    int hash_number = hash(word,1009);
    list* node = hashTable[hash_number];
    node = add(node,word);
    read(word, book);
  }
}

list *add(list *old_list, char new_word[20])
{
  //this is a special case when the head of the list is empty
  if(old_list==NULL)
  {
    return insert(new_word,NULL);
  }
  else
  {
    list *new_list = old_list;
    if (doesExist(new_list, new_word, true) == 0)
    {
      while (new_list->next !=NULL)
      {
        new_list = new_list->next;
      }
      new_list->next=insert(new_word,NULL);
    }
    return old_list;
  }
}

这适用于普通的链表,但是当我尝试在我的哈希表函数中重用它时它会崩溃。

【问题讨论】:

  • 为什么要和"EOF"比较?该文件不包含任何形式的"EOF",它只是一些函数返回的一个整数,表示您在文件末尾之后已经走了。

标签: c hash linked-list


【解决方案1】:

您的add 函数返回新的列表头。这个:

list* node = hashTable[hash_number];
node = add(node,word);

不会更新哈希表中的头指针。它将新的头分配给局部变量node,该变量立即超出范围。使用:

hashTable[hash_number] = add(hashTable[hash_number], word);

头节点的重复不是很优雅,很容易忘记存储新的头指针。考虑重写您的 add 函数,以便第一个参数是指向头指针的指针,然后您可以对其进行更新。

但是,该错误并不能解释分段错误。你有没有初始化所有 1009 个头指针 tom NULL?您的哈希函数是否保证返回 0 到 1008 之间的数字?您没有显示哈希函数,但您的哈希码是有符号整数。使哈希码无符号是很常见的,因此算术溢出永远不会产生负数。 (有点令人惊讶的是,(-a) % 1009 在 C 中是负数。)

【讨论】:

    猜你喜欢
    • 2013-12-25
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 2018-10-29
    • 2018-05-09
    • 2012-04-26
    相关资源
    最近更新 更多