基于未初始化值的条件移动,未初始化值由堆分配创建

标签 c malloc valgrind

您好,我从 valgrind 收到以下错误。

Conditional move based on uninitialized values, Uninitalized values was created by heap allocation.

编译器不会提示。

我在 stackoverflow 上查看了大部分类似的错误,但我似乎无法确定我的错误所在。

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>

    int
    main(void)
     {

      char *string1 = malloc(45);
      char string2[25] = "HELLO WORLD";
      strcpy(string1,string2);
      printf("String one is %s\n",string1);

      char string3[25];
      for (int i = 0; i < 25; i++)
       {
        string3[i] = tolower(string1[i]);

       }
      printf("The output is %s\n",string3);
      free(string1);
      return 0;

    }

最佳答案

您的 tolower 调用访问了 string1 指向的内存的前 25 个字节,但只有该内存的前 12 个字节是处于有效状态(感谢 strcpy)。

您可以使用 calloc 而不是 malloc 来分配具有确定性状态的内存。或者,只复制所需的字节数:

{
    const unsigned int M = max(24, strlen(string1));
    for (unsigned int i = 0; i != M; ++i)
        string3[i] = tolower(string1[i]);
    string3[M] = 0;
}

关于基于未初始化值的条件移动,未初始化值由堆分配创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8913562/

相关文章:

c - C双指针(矩阵)的基本问题

cuda 和 cudamalloc 分配大内存块失败

c - strcastr 中的读取大小无效

c - postgresql 的 Valgrind 错误

Char ** 使用和打印

c - 快速算法将 int 映射到单调递增的 int 子集

c - 如何在 C 中检查 ndarray 的数据类型

c - 从文件中读取特定行

c - 我是否必须在函数内分配返回的字符串?

c - Valgrind 地址在线程的 1 堆栈上