当我运行以下代码时
valgrind ./test
我收到以下错误:
==8389== Conditional jump or move depends on uninitialised value(s)
==8389== at 0x4E88CC0: vfprintf (vfprintf.c:1632)
==8389== by 0x4E8F898: printf (printf.c:33)
==8389== by 0x40072F: main (test.c:30)
我在下面提示的行中添加了评论:
int main (int argc, char **argv) {
char str[] = "a string";
int str_len = strlen(str);
char *str2 = malloc(sizeof(char) * (str_len+1)); //source of uninitialised value
strncpy(str2, str, str_len);
printf("%s",str2); //source of error
free(str2);
exit (0);
}
str2 由 strncpy 分配了一个值,那么为什么它在到达 printf 时未初始化?
最佳答案
您的代码永远不会初始化 str2[str_len]
。
在您的代码中,str_len
为 8。您需要 strncpy
复制 9 个字节,即“字符串”的 8 个字节和终止字符串的零字节。但是你只让 strncpy
复制 str_len
字节,即 8。所以你不复制终止零字节和 printf
读取结束您在寻找它时复制的数据。
所以你有一个错误。相反,传递 strncpy
缓冲区的大小或比 strlen(str)
多一个。
关于c - 为什么 valgrind 报告未初始化值错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54727820/