我创建了下一个代码以获得char *,但是执行此代码后,finalResult的大小大于预期,并带有一些垃圾字符。为什么??我该如何解决?

//returns void
void processChar(){
            //.... more stuff here
            // init is a previous char*
            char* end = strstr(init,"</div>");
            if(end != NULL){
                    long length = strlen(init) - strlen(end);
                    if (length > 0){
                            char* finalResult = malloc(length);
                            strncat(finalResult, init,length);
                            //these lengths are different,being strlen(finalResult) > length
                            NSLog(@"%d %d",strlen(finalResult),length);
                            //... more stuff here
                    }
            }
            return;
}

最佳答案

这段代码:

char* finalResult = malloc(length);
strncat(finalResult, init,length);


会给你一个不确定的结果。您试图将finalResultinit连接,即使您从未初始化finalResult。也许您打算使用strncpy()代替strncat()

另外,finalResult还不够大。它也需要保留终止的\0字符,因此您应该使用以下字符进行分配:

char* finalResult = malloc(length + 1);


此外,正如Keith Thomson指出的那样,在使用dangers of strncpy()时要当心。

在这种情况下,可以通过在分配后简单地将strncpy()初始化为空字符串来避免使用finalResult,然后像以前一样使用strncat()

char* finalResult = malloc(length + 1);
finalResult[0] = '\0';
strncat(finalResult, init, length);


当然,您还应该检查malloc()的返回值是否存在内存不足错误,但这不在您的问题范围内。

10-06 14:21