2012-08-30 61 views
0

== 3139 ==条件跳转或移动取决于未初始化值(S)线性探测哈希表插入

== 3139 ==在0x4A0673F:的strcpy(mc_replace_strmem.c:311)

== 3139 ==由0x400ADB:htable_insert(hashtable.c:56)

== == 3139通过0x400F25:主(mylib.c:11)

大家好,我仍然试图插入到一个哈希表。我无法完成它的工作,我已经包含了我的打印方法,只是因为我认为这可能是一个问题。我试图做线性探测。当我跑valgrind时,我得到了这个错误,我认为它与复制到我的字符串有关,但我不确定是什么意思?我真的不此时知道如何得到这个工作的插入,一些输入将是美好的...
线56在哈希表中插入是的strcpy(STR,键)

int htable_insert(htable h, char *str) { 
    int i; 
    /*convert string to integer*/ 
    unsigned int index = htable_word_to_int(str); 
    /*calculate index to insert into hash table*/ 
    int remainder = index%h->capacity; 
    /*once calculated position in the hash table, 3 possibilities occur*/ 
    /*no string in this positon, copy string to that position, increment number of keys, return 1*/ 
    if (h->key[remainder] == NULL) { 
     char *key = emalloc(strlen(str) + 1); 
     strcpy(str, key); 
     h->key[remainder] = key; 
     h->frequencies[remainder] = 1; 
     h->num_keys++; 
     return 1; 
    } 
    /*the exact same string is at the position, increment frequency at that position, return frequency*/ 
    if (strcmp(str, h->key[remainder]) == 0) { 
     h->frequencies[remainder]++; 
     return h->frequencies[remainder]; 
    }/*a string is at that position, but it isnt the rightone, keep moving along the array 
     until you find either an open space or the string you are looking for*/ 
    if (h->key[remainder] != NULL && strcmp(str, h->key[remainder]) != 0) { 
     /*you may need to wrap back around to the beginning of the table, so each time you add 
     to the position you should also mod by the table capacity.*/ 
     for (i = 0; i <= h->capacity; i++) { 
     /*no string in this positon, copy string to that position, increment number of keys*/ 
     if (h->key[remainder] == NULL) { 
      char *key = emalloc(strlen(str) + 1); 
      strcpy(str, key); 
      h->key[remainder] = key; 
      h->frequencies[remainder] = 1; 
      h->num_keys++; 
     } 
     /*if you find the string you were looking for, increment the frequecny at the position 
      and return the frequency*/ 
     if (strcmp(str, h->key[remainder]) == 0) { 
      h->frequencies[remainder]++; 
      return h->frequencies[remainder]; 
     } 
     if (h->key[remainder] != NULL && h->capacity == i) { 
      i = 0; 
     } 
     } 
    } 
    /*if you have kept looking for an open space but there isnt one, the hash table must fu*/ 
    return 0; 
} 

void htable_print(htable h, FILE *stream) { 
    int i; 
    for(i = 0; i < h->capacity; i++) { 
     if(h->key[i] != NULL) { 
     fprintf(stream, "%d%s\n", h->frequencies[i], h->key[i]); 
     } 
    } 
} 

回答

1

你的strcpy的应该是的strcpy(键,str),而不是相反。 (你可以使用strdup,顺便说一句,并保存malloc + strcpy)。

另外,在: 如果(!H->键[其余] = NULL & &的strcmp(STR,H->键[余数)= 0){

条件“H->关键[余数]!= NULL“是多余的:你已经检查过了。

最后,在你的循环(打算在桶),这似乎是:

  1. 循环条件应该是<,不< =
  2. 你应该某处递增余,或使用“余+ i“和索引到h->键
  3. 而不是”capacity == i“ - >”i = 0“,只需使用”(余数+ i)%容量“作为h->键的索引

..最后最后 - 初始部分,即循环外部的部分,可以在循环中,保存代码。

+0

好吧,所以我改变了循环条件和复制的东西。你在2和3说的话让我有点困惑。 – courtney

+0

但是,谢谢你,你确实解决了我的问题:) – courtney

+0

“条件”h->键[余数]!= NULL“是多余的” - ** **条件都是多余的。 –