嗨,我从瓦尔格林德收到以下错误。
基于未初始化值的条件移动,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)
字节。