所以我知道还有其他人和我有同样的问题,但是不幸的是我没有得到解决...所以基本上我正在寻找哈希表中的键(基于给定的单词)(如果找不到) NULL,但如果找到,则返回值。它会自我重复,直到读取的FILE中没有更多的单词为止。
这是valgrind的输出。
==877683== Conditional jump or move depends on uninitialised
value(s)
==877683== at 0x4C31258: __strlen_sse2 (in
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==877683== by 0x401641: _strdup (loesung.c:58)
==877683== by 0x401641: ht_get (loesung.c:212)
==877683== by 0x400E5C: main (loesung.c:513)
==877683== Uninitialised value was created by a stack
allocation
==877683== at 0x400B0A: main (loesung.c:325)
这是一些代码...
while((c = fgetc(input)) != EOF) {
if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){
...
}
else if(c == 10 || (c >= 32 && c <= 64) || (c >= 91 && c <=
96) || (c >= 123 && c <= 126)){
if(ht_get(dict,word) == NULL){....} //LINE 513
int main(int argc, char *argv[]){ //LINE 325 Where the value
was created apparently... I
dont get this at all!
if(argc != 2){
fprintf(stderr,"...");
exit(2);
return 2;
}
else {
wb = fopen(argv[1], "r");
}
这是函数ht_get ...
char *ht_get(HashTable *hashtable, const char *key){
char *key_cp = NULL;
unsigned int i = 0;
List *tmp;
key_cp = _strdup(key); //LINE 212
i = hash(key, hashtable->size);
tmp = hashtable->array[i];
while (tmp != NULL) {
if (str_cmp1(tmp->key, key_cp) == 0) {
break;
}
tmp = tmp->next;
}
free(key_cp);
if (tmp == NULL) {
return NULL;
}
return tmp->value;
}
并且_strdup函数与strdup相同,但是我必须自己编写它,因为string.h库中的那个不起作用。
所以我想做的就是初始化变量liek this:
char * getWord;
getWord = strdup(ht_get(dict,word));
以及:
char * getWord = ht_get(dict,word);
和其他一些不起作用的方式。 很抱歉,这个问题很久。
答案 0 :(得分:0)
仔细检查以下三行内容:
==877683== by 0x401641: _strdup (loesung.c:58)
==877683== by 0x401641: ht_get (loesung.c:212)
==877683== by 0x400E5C: main (loesung.c:513)
从您的代码段中:
...
key_cp = _strdup(key); //LINE 212
...
if(ht_get(dict,word) == NULL){....} //LINE 513
...
由于
key
是ht_get
的第二个参数并传递给_strdup
,因此得出的结论是word
尚未初始化。
尽管您没有显示所有代码,但有可能正在构建word
,直到遇到单词分隔符,然后调用ht_get
。
如果遇到的第一个字符是单词分隔符,则您的逻辑缺陷是
word
不会被初始化。
一种可能的解决方法是建立一个标志来指示您是否创建了单词。该标志被初始化false
,并且在形成单词时变为true
,并且在处理单词分隔符时变为false
。
bool have_word = false; ... while ((c = fgetc(input)) != EOF) { if (isalpha(c)) { ... make a word have_word = true; } else { if (have_word) { ... process a word } have_word = false; } ...