Условное перемещение на основе неинициализированных значений. Неинициализированные значения были созданы при выделении кучи. - PullRequest
0 голосов
/ 18 января 2012

Привет, я получаю следующую ошибку от 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 ]

3 голосов
/ 18 января 2012

Ваш вызов tolower обращается к первым 25 байтам памяти, на которые указывает string1, но только первые двенадцать байтов этой памяти находятся в действительном состоянии (благодаря 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;
}
2 голосов
/ 18 января 2012

Вы выполняете цикл от 0 до 24 по string1, который был инициализирован только 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) байт.

...