2013-11-09 120 views
0

我正在写使用C.带我想做的事情得到一个子,我已经写了一个简单的C代码,它的一个普通旧工作的Android本机应用程序的结束。这是代码:奇怪的字符(0010)在字符串

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的输出截图: enter image description here

我想填充更多的空值,2或甚至3,但并没有改变任何东西!

是否有人知道它是什么,以及如何才能摆脱呢?

回答

2

无论alloc也不strncpy零出新分配的内存。您需要在新字符串的末尾手动添加零。

可能是您在桌面上以调试模式运行此操作,并且大量编译器以调试模式(仅)调出新分配的内存。

它所需要的是这样的附加线路:

alloc[len] = 0; 

注意:您不需要/用C不该投的malloc:Do I cast the result of malloc?

+0

糟糕!同样的错误不会阻止开发人员:D谢谢。 – Mousa

+0

谢谢你的提示,但ndk在我不转换它时给出了一个错误:“在函数'char * get_part_allocated(char const *,int,int)'中:错误:从'void *'无效转换为' char *'[-fpermissive]“我认为这可能是ndk使用C++编译器,对吧? – Mousa

+1

正确,在C中强制转换是可选的(并且不必要),但对于C++强制转换。这可能意味着,你正在编译你的.c文件,就好像它是.cpp文件一样。正如你所看到的,它有这种相对无害的副作用,但可能有其他的。检查您是否可以强制编译器将.c和C++用于.cpp文件。 – usr2564301

1

原因是strncpy()函数犯规NULL终止目标字符串,所以你的代码应该如下所示。

strncpy(alloc, src+start, len); 
alloc[len]='\0' ; 

这应该可以解决您的问题。

+0

谢谢萨加尔,是的,这是问题,因为我误解了文档,并认为功能会为我做。 – Mousa