您好我从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;
}
答案 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)
个字节。