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

时间:2012-01-18 16:20:25

标签: c malloc valgrind

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

  

基于未初始化值的条件移动,未分配的值是通过堆分配创建的。

编译器没有抱怨。

我查看了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;

    }

2 个答案:

答案 0 :(得分:3)

您的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;
}

答案 1 :(得分:2)

你沿着string1从0循环到24,它只被初始化strlen("HELLO WORLD") + 1个字节。索引从12到24的字节尚未初始化,您不应该尝试阅读它们。您应该使用calloc()分配string1或使用memset()对其进行初始化,如下所示:

char *string1 = calloc(1, 45);

char *string1 = malloc(45);
memset(string1, 0, 45);

或者您可以使用上述方法将string3初始化为零,然后仅复制strlen(string1)个字节。