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



嗨,我从瓦尔格林德收到以下错误。

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

编译器不会抱怨。

我在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 %sn",string1);
      char string3[25];
      for (int i = 0; i < 25; i++)
       {
        string3[i] = tolower(string1[i]);
       }
      printf("The output is %sn",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;
}

您沿着 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)字节。

相关内容

  • 没有找到相关文章