【发布时间】:2015-11-13 06:15:58
【问题描述】:
==2630== Conditional jump or move depends on uninitialised value(s)
==2630== at 0x4E82D71: vfprintf (in /usr/lib64/libc-2.21.so)
==2630== by 0x4E88E78: printf (in /usr/lib64/libc-2.21.so)
==2630== by 0x400C0C: searchWord (T9.c:91)
==2630== by 0x400A0A: main (T9.c:40)
==2114== Uninitialised value was created by a heap allocation
==2114== at 0x4C28C50: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==2114== by 0x400FD1: newStr (trie_node.c:125)
==2114== by 0x400F8C: create_trie (trie_node.c:117)
==2114== by 0x4009D5: main (T9.c:37)
通过在 valgrind 中运行跟踪功能,我收到了上面的错误消息。我很确定我已经初始化了变量。 这是结构代码:
struct wordList* newStr(char* text) {
char* word;
struct wordList* tmp = (struct wordList*)malloc(sizeof(struct wordList));
word = (char *)malloc(sizeof(char) * strlen(text) + 1);
strncpy(word, text, strlen(text));
tmp->str = word;
tmp->next = NULL;
return tmp;
}
以及 T9.c 第 91 行周围的代码:
struct wordList* cur;
if (cur && invalid == 0 && flag == 0) {
printf("\t\'%s\'\n", cur->str);
}
更新:
我修改 strncpy 行来自
strncpy(word, text, strlen(text));
到
word = strncpy(word, text, strlen(text));
这解决了未初始化的问题,但是我收到了我不理解的新错误消息:
==3245== Invalid read of size 1
==3245== at 0x4E82D71: vfprintf (in /usr/lib64/libc-2.21.so)
==3245== by 0x4E88E78: printf (in /usr/lib64/libc-2.21.so)
==3245== by 0x400C0C: searchWord (T9.c:91)
==3245== by 0x400A0A: main (T9.c:40)
==3245== Address 0x51f7d45 is 0 bytes after a block of size 5 alloc'd
==3245== at 0x4C28C50: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==3245== by 0x400FC1: newStr (trie_node.c:124)
==3245== by 0x400F80: create_trie (trie_node.c:117)
==3245== by 0x4009D5: main (T9.c:37)
【问题讨论】:
-
text的值是多少? -
你可以省略
sizeof(char),因为那将是1,但如果你想明确一点,请在strlen(text) + 1周围加上括号。另外,不要强制转换 malloc 的返回值:void *会自行找到您的char *word。 -
请把图片中的代码贴出来,去掉图片。
-
strncpy有一个更安全的变体:它称为strcpy。在这里使用它可以避免这个错误。 -
@M.M u 刚刚解决了我的问题