c - 为什么 valgrind 报告未初始化值错误?

标签 c valgrind

当我运行以下代码时

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/

相关文章:

c - 如何遍历多级链表?

android - ndk 中的 LocalBroadcastManager

c- valgrind(无效的 free()/delete/delete[]/realloc())套接字

c - 我的c程序运行完成后崩溃了

android - android中 native 网络相关功能随机阻塞

c - OpenCV 2.3 中的 cvaux230d.lib 在哪里?

c - Valgrind 崩溃并给我这个无效的 realloc 警告

c++ - 调试boost::thread应用,误报率高

c - valgrind 大小 1 的无效读取 - 比较期间发生

c++ - 我如何理解我的 valgrind 错误消息?