解决Valgrind给出的未初始化的值错误

时间:2015-02-07 20:57:21

标签: c debugging 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] != '\0') /* 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;
}

2 个答案:

答案 0 :(得分:1)

下面:

if(temp != NULL)

您需要检查

if(temp[0] != '\0')

temp是一个数组,而不是指针。

并且(正如Paul Griffiths指出的那样),在while循环之后终止你的字符串:

temp[i] = '\0';

答案 1 :(得分:1)

您永远不会在temp中空终止字符串,因此strlen()strcpy()都会读取数组中的初始化值,因此Valgrind会给您带来未初始化的值错误。

变化:

char temp[100];

为:

char temp[100] = {0};

你应该好。