哈希表中的分段错误-C

时间:2019-03-14 01:51:21

标签: c struct memory-leaks segmentation-fault hashtable

我目前正在上课的编程作业。我在其中一项功能中遇到段错误,无法解决问题的根源。我已尽力而为,发现段错误发生在“ if(myNode-> key == key)”中。任何明智的话都会有所帮助!

struct node*searchForPerson(const char *value){
int key=convertToKey(value);
struct node *myNode;

int i=0;
int j = (key % 8)+(i*(key%5));


while (i < size - 1 && hashTable[j].head != NULL && hashTable[j].index != key ) {
    i++;
    j=(key % 8)+(i*(key%5));
}
myNode=hashTable[j].head;

if(myNode->key==key) {

    printf(" found\n");
    return myNode;
}
else{
printf("not found\n");
    return NULL;
    }
}

我认为问题的根源可能是我插入哈希函数:

void insertToHash(int key,  char *value){

int i = 0;
int j = (key % 8)+(i*(key%5));
struct node *newnode = createNode(key, value);
/*head of list for the bucket with index "hashIndex"*/
if (!hashTable[j].head) {
    hashTable[j].head = newnode;
    hashTable[j].count=1;
    return;
}

while (i < size - 1 && hashTable[j].head != NULL) {
    i++;
    j=(key % 8)+(i*(key%5));
}
//adding new node to the list
hashTable[j].head=newnode;
hashTable[j].count++;
return;



hashTable[j].head = newnode;
hashTable[j].count++;
}

1 个答案:

答案 0 :(得分:1)

您应该添加一个if语句,以确保hashTable[j].head不是NULL

请记住,您的while循环条件是ANDing 3个条件,因此如果其中任何一个变为假,则循环将退出。特别是在循环之后,您不知道它是否退出,因为

  1. i现在大于或等于size - 1
  2. hashTable[j].head现在等于NULL
  3. hashTable[j].index现在等于key

如果情况为(2),则myNode将是NULL,因此myNode->key将取消引用空指针,从而导致段错误。