char*大小与malloc之后的预期不同

fco*_*tes -1 c memory arrays objective-c char

我已经创建了下一个获取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;
}
Run Code Online (Sandbox Code Playgroud)

Nik*_* C. 6

这段代码:

char* finalResult = malloc(length);
strncat(finalResult, init,length);
Run Code Online (Sandbox Code Playgroud)

会给你一个不确定的结果.你试图拼接finalResult具有init,即使你从来没有初始化finalResult.也许你打算用strncpy()而不是strncat()

而且,finalResult还不够大; 它还需要保存终止\0字符,因此您应该使用以下内容进行分配:

char* finalResult = malloc(length + 1);
Run Code Online (Sandbox Code Playgroud)

此外,正如Keith Thomson所指出的那样,要小心你使用它时的危险strncpy().

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

char* finalResult = malloc(length + 1);
finalResult[0] = '\0';
strncat(finalResult, init, length);
Run Code Online (Sandbox Code Playgroud)

当然,您还应该检查malloc()内存不足错误的返回值,但这超出了您的问题的范围.

  • 你很可能[不想使用strncpy()](http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not-safer-strcpy.html). (3认同)
  • 在这里同意@Keith,`strncpy`在这里没用,因为你已经_know_你有足够的空间(当然你曾经在`malloc`中'+ 1`).`strncpy`一般来说在其他方面很危险,因为它并不总是给你一个C字符串,但这也与此无关,原因与上述相同.我将"随机"改为"未定义",因为我今天感觉特别迂腐:-)但是+1,无论如何,因为答案的本质是正确的. (2认同)