无法解决 Valgrind 给出的未初始化值错误
Trouble solving uninitialised value error given by Valgrind
我目前正在编写一个测试程序来解析来自流的输入。我不会详细介绍这个程序,但我目前正在尝试解析字母数字字符,然后将它们分配给临时字符串 temp[100]。将所有有效字符分配给 temp 后,我将内存和 strncpy 分配给分配的字符串变量。
Valgrind 抱怨我两次使用 strlen 和一次使用 strncpy。为什么是这样?它抱怨未初始化的值,但我明确表示它不会进行任何分配,除非 temp 中有字符。有什么建议吗?
char *name(char a)
{
int x;
char c;
char *returnName = 0;
char temp[100];
int i = 0;
/* Ensures no character is skipped */
temp[i] = a;
i++;
/* Fill temp one character at a time */
while((x = getchar()) != EOF)
{
c = (char)x;
/* Valid characters are assigned */
if((isalnum(c)) || c == '_')
{
temp[i] = c;
i++;
}
/* As soon as invalid character appears, exit loop */
else
break;
}
/* Make sure temp is not NULL before mallocing */
if(temp[0] != '[=10=]') /* Thank you Alter Mann for this fix */
{
printf("Before malloc\n");
returnName = malloc(sizeof(char)*strlen(temp)+1);
printf("After malloc before strncpy\n");
strncpy(returnName, temp, strlen(temp)+1);
printf("After strncpy before return\n");
return returnName;
}
/* If nothing is assigned, return NULL */
return NULL;
}
这里:
if(temp != NULL)
你需要检查
if(temp[0] != '[=11=]')
temp
是数组,不是指针。
并且(正如 Paul Griffiths 所指出的),在 while
循环之后以 NUL 终止您的字符串:
temp[i] = '[=12=]';
您从未在 temp
中以 null 终止您的字符串,因此 strlen()
和 strcpy()
都读取了数组中的初始化值,因此 Valgrind 给出了未初始化值错误你.
变化:
char temp[100];
至:
char temp[100] = {0};
你应该很好。
我目前正在编写一个测试程序来解析来自流的输入。我不会详细介绍这个程序,但我目前正在尝试解析字母数字字符,然后将它们分配给临时字符串 temp[100]。将所有有效字符分配给 temp 后,我将内存和 strncpy 分配给分配的字符串变量。
Valgrind 抱怨我两次使用 strlen 和一次使用 strncpy。为什么是这样?它抱怨未初始化的值,但我明确表示它不会进行任何分配,除非 temp 中有字符。有什么建议吗?
char *name(char a)
{
int x;
char c;
char *returnName = 0;
char temp[100];
int i = 0;
/* Ensures no character is skipped */
temp[i] = a;
i++;
/* Fill temp one character at a time */
while((x = getchar()) != EOF)
{
c = (char)x;
/* Valid characters are assigned */
if((isalnum(c)) || c == '_')
{
temp[i] = c;
i++;
}
/* As soon as invalid character appears, exit loop */
else
break;
}
/* Make sure temp is not NULL before mallocing */
if(temp[0] != '[=10=]') /* Thank you Alter Mann for this fix */
{
printf("Before malloc\n");
returnName = malloc(sizeof(char)*strlen(temp)+1);
printf("After malloc before strncpy\n");
strncpy(returnName, temp, strlen(temp)+1);
printf("After strncpy before return\n");
return returnName;
}
/* If nothing is assigned, return NULL */
return NULL;
}
这里:
if(temp != NULL)
你需要检查
if(temp[0] != '[=11=]')
temp
是数组,不是指针。
并且(正如 Paul Griffiths 所指出的),在 while
循环之后以 NUL 终止您的字符串:
temp[i] = '[=12=]';
您从未在 temp
中以 null 终止您的字符串,因此 strlen()
和 strcpy()
都读取了数组中的初始化值,因此 Valgrind 给出了未初始化值错误你.
变化:
char temp[100];
至:
char temp[100] = {0};
你应该很好。