条件跳转或移动依赖于初始化的值,即使我的变量是初始化的



根据Valgrind,变量"holder"在我的函数spaceMove()中未初始化。值得注意的是,当我试图操作这个变量时。我尝试在进入循环之前将其初始化为NULL,但它仍然给我相同的消息。如果有人能解释为什么holder被认为是未初始化的,将不胜感激,请和谢谢。

void spaceMove(char *str, char *delim){
    int i, spPlus=0;
    char *holder;
    holder = malloc(strlen(str)+1);
    for(i=0; i<strlen(str); i++, spPlus++){
        if(str[i] == ' ' && str[i+1] == ' '){
            strcat(holder, " "); //line 11
            //spPlus += 1;
            i += 1;
        }
        else if(str[i] == 't' && str[i+1] == 't'){
            strcat(holder, "t"); //line 16
            i += 1;
        }
        holder[spPlus] = str[i];
    }
    strcpy(str, holder);    //line 21
}
void processStrings(struct mainList *header){
    int i;
    struct stringList *temp;
    temp = header->next;
    while(temp != NULL){
        for(i=0; i<strlen(temp->string); i++){
            if(temp->string[i] == ' ' || temp->string[i] == 't'){
                spaceMove(temp->string, " "); //line 101
            }
        }           
        temp = temp->next;
    }
}

下面是Valgrind的消息:

==3102== Conditional jump or move depends on uninitialised value(s)
==3102==    at 0x4C2F0A8: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3102==    by 0x400B38: spaceMove (listHelper.c:21)
==3102==    by 0x4010CF: Strings (listio.c:101)
==3102==    by 0x4009A4: main (tempMain.c:27)
==3102== 
==3102== Conditional jump or move depends on uninitialised value(s)
==3102==    at 0x400A69: spaceMove (listHelper.c:11)
==3102==    by 0x4010CF: Strings (listio.c:101)
==3102==    by 0x4009A4: main (tempMain.c:27)
==3102== 
==3102== Conditional jump or move depends on uninitialised value(s)
==3102==    at 0x400AC8: spaceMove (listHelper.c:16)
==3102==    by 0x4010CF: Strings (listio.c:101)
==3102==    by 0x4009A4: main (tempMain.c:27)

不能在非以''结尾的字符串

中使用strcat
holder = malloc(strlen(str)+1);
holder[0] = ''; /* Add this line */

或者用calloc代替malloc

最新更新