我正在使用C编写一个原生应用程序。在某个地方,我想做一个很简单的获取子字符串的工作,我已经为它编写了一个简单的C代码。这是代码:
char* get_part_allocated(const char* src, int start, int len)
{
LOGI("copying [%s] from [%d] len [%d]\n", src, start, len);
int nlen = len+1;
char* alloc = (char*)malloc(nlen*sizeof(char));
strncpy(alloc, src+start, len);
LOGI("result is: [%s]\n", alloc);
return alloc;
}
当我在PC中编译并运行此代码时,我得到了预期的结果,但是当我在android上运行它时,它最终会有一个奇怪的字符,这会破坏我程序的流程并导致错误!
这是logcat输出的屏幕截图:
我尝试填充更多的NULL,2甚至3,但没有改变任何东西!
有人知道它是什么,我怎么能摆脱它?
答案 0 :(得分:2)
alloc
和strncpy
都没有将新分配的内存清零。您需要在新字符串的末尾手动添加零。
您可能正在桌面上的调试模式下运行此命令,并且许多编译器 将调试模式中的新分配的内存清零(仅限)。
所需要的只是这一额外的一行:
alloc[len] = 0;
注意:您不需要/不应该在C:Do I cast the result of malloc?
中投射malloc答案 1 :(得分:1)
原因是strncpy没有NULL终止目标字符串,所以你的代码应该如下所示。
strncpy(alloc, src+start, len);
alloc[len]='\0' ;
这应该可以解决您的问题。