无法解决 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};

你应该很好。