Я создал связанный класс списка, но эта функция генерирует ошибки valgrind, говоря, что есть условный переход, основанный на неинициализированном значении этой функции. Я не совсем уверен, что мне нужно сделать, чтобы исправить это.Valgrind Uninitialized Values (создание связанного списка данных struct)
По существу, существует класс узлов для связанного списка, и он выполняет итерацию по всем узлам, проверяя, соответствует ли ключевой параметр предварительно существующему узлу, и если он возвращает значение.
const char *dictionary_get(dictionary_t *d, const char *key)
{
node* current;
current = d->head;
if(strcmp(current->key,key)==0)
return current->value;
while(current->next != NULL){
current = current->next;
if(current!=NULL && strcmp(current->key,key)==0)
return current->value;
}
return NULL;
}
Любые идеи?
Я с VALGRIND пересматриваются отслеживания происхождения, и это выход:
==25042== Conditional jump or move depends on uninitialised value(s)
==25042== at 0x4A06E6A: strcmp (mc_replace_strmem.c:412)
==25042== by 0x400DD6: dictionary_get (libdictionary.c:143)
==25042== by 0x400826: main (part2.c:84)
==25042== Uninitialised value was created by a stack allocation
==25042== at 0x400AE3: dictionary_parse (libdictionary.c:69)
==25042==
==25042== Conditional jump or move depends on uninitialised value(s)
==25042== at 0x4A06E8A: strcmp (mc_replace_strmem.c:412)
==25042== by 0x400DD6: dictionary_get (libdictionary.c:143)
==25042== by 0x400826: main (part2.c:84)
==25042== Uninitialised value was created by a stack allocation
==25042== at 0x400AE3: dictionary_parse (libdictionary.c:69)
==25042==
==25042== Conditional jump or move depends on uninitialised value(s)
==25042== at 0x400DD9: dictionary_get (libdictionary.c:143)
==25042== by 0x400826: main (part2.c:84)
==25042== Uninitialised value was created by a stack allocation
==25042== at 0x400AE3: dictionary_parse (libdictionary.c:69)
Похоже, это может приходить от dictionary_parse, поэтому я выложу эту функцию тоже.
int dictionary_parse(dictionary_t *d, char *key_value)
{
char* colon;
char* space;
colon = key_value;
space = key_value;
space++;
int key_length = -1; //Default key length to check for failure
int i=0;
int j=0; // Loop variables
int k=0;
int length = strlen(key_value);
for(i=0;i<length-2;i++){
if(*colon == ':' && *space == ' '){
key_length = i;
break;
}
colon++;
space++;
}
if(key_length == -1 || key_length == 0)
return -1;
int value_length = length-2-key_length;
colon = key_value;
char key_word[key_length];
key_word[0] = '\0';
char value_word[value_length];
value_word[0] = '\0';
for(j=0;j<key_length;j++){
key_word[j] = *colon;
colon++;
}
space++;
for(k=0; k<value_length;k++){
value_word[k] = *space;
space++;
}
char* finalkey[key_length];
strcpy((char*)finalkey,key_word);
char* finalvalue[value_length];
strcpy((char*)finalvalue,value_word);
dictionary_add(d,(char*)finalkey,(char*)finalvalue);
return 0;
}
Эй, пожалуйста, запустить Valgrind так же, как вы были, но и с '--track-originins = yes' и вставить результат в вопрос. Также вы можете использовать 'gdb' для проверки программы с помощью' --db-attach = yes' – alternative
Какая строка находится в строке 69 в libdictionary.c? Какая строка - строка 84 в part2.c? – alternative
84 in part2.c: s = dictionary_get (& dictionary, "e"); 69 в libdict.c: int dictionary_parse (dictionary_t * d, char * key_value) { – newprogrammer