C语言中free()函数的问题

-3 c malloc pointers strlen

我在while循环中有一个for循环来处理字符串.这基本上是我的代码的结构:

char myString[1000];
//Initialize and maybe change myString
for(/*conditions*/){
    while(/*conditions*/){
        if(strchr(myString,' ') == NULL){
            break;
        }
        char *temp = malloc(sizeof(char) * strlen(myString));
        strcpy(temp,myString);
        *strchr(temp,' ') = '\0';
        strcat(myString," ");
        strcat(myString,temp);
        free(temp);
    }
}
Run Code Online (Sandbox Code Playgroud)

有时,这段代码运行得很好,但有时候进程结束并返回3,这意味着有一个错误(3是我尝试使用NULL时通常会得到的返回值,我不应该喜欢,例如myPointer->examplewhere myPointerNULL ).经过一些测试,我发现引起问题的那条线是free(temp);.我试图替换它,if(temp != NULL){free(temp);}但它没有改变任何东西.我试图tempchar temp[1000]而不是malloc拿走free(temp);线来宣布,但它仍然做同样的事情.如果我拿走free(temp);线路仍然使用malloc问题解决了,但是存在巨大的内存泄漏,所以我不能这样做.如果有错误取决于myString字符串中的内容,这意味着如果那里有某个值,则总会出现错误,如果有另一个特定值,则永远不会出现错误,但我可以我们设法找出哪种类型的价值观有效,哪些价值观无效,似乎是随机的.

为什么free(temp);有时候工作,有时候不工作,怎样才能让它始终有效?

Sou*_*osh 5

主要问题是,你分配的一个元素少于所需的内存.

strlen()不考虑终止空值,所以你只需要一个所需的内存.做完了

strcpy(temp,myString);
Run Code Online (Sandbox Code Playgroud)

实际上是超出绑定访问(存储终止null),它调用未定义的行为.结果,你可以看到

有时,这段代码工作正常,但有时进程结束并返回3,这意味着有错误[....]

要解决,您应该修改分配语句,如

char *temp = malloc(strlen(myString) + 1); // +1 for terminating null,
                                           // sizeof(char) == 1, guaranteed by C standard.
Run Code Online (Sandbox Code Playgroud)

也就是说,来自手册页

strchr()strrchr()函数返回一个指向匹配的字符,如果没有找到字符或NULL.[...]

并且,对于突出显示的场景,

*strchr(temp,' ') = '\0';

尝试取消引用无效的空指针constant(NULL),并再次调用UB.在取消引用返回的指针之前检查有效的返回值