2012-03-08 70 views
0

当在C中为字符串动态分配内存时,你计算字符串char的\ 0结尾吗?当在C中为字符串动态分配内存时,你计算字符串char的 0结尾吗?

char *copyInto, *copyFrom="test"; 

// Should 
copyInto = (char*)malloc(strlen(copyFrom)); 
// suffice? 

// or should this be the following? 
copyInto = (char*)malloc(strlen(copyFrom)+1); 

// assuming you want to copy the string from copyFrom into copyInto 
strcpy(copyInto,copyFrom); 

// Does anyone recommend just \0-ing the whole copyInto as in 
copyInto = (char*)calloc(strlen(copyFrom)+1); 
// and if so, should it still be (strlen(copyFrom)+1) size? 
+4

让我们看看......你打算存储那个空终止符? – 2012-03-08 00:47:51

+0

我读了标题,而不是正文。答案是肯定的。分配长度加1个字符。 – asveikau 2012-03-08 00:51:57

+0

@ K-ballo如果我没有存储该空终止符,C stdlib字符串处理函数不知道该字符串结束的位置吗?如果最后一个有效char位置后面的内存字节没有被设置为\ 0,那么C字符串处理器会一直持续到第一个\ 0。如果我们没有设置并存储它,我们不能保证最后一个字符后面的字节是\ 0。 – 2012-03-08 02:53:33

回答

6
  1. 不要在C程序中投的malloc()calloc()(或realloc()为此事)的返回值。
  2. 是的,你需要有+1
  3. 为什么要使用calloc()来清零整个字符串,如果你只是想立即复制它?似乎浪费了我的周期。
+0

在#1中,添加类似'#include '的字样,而不会阻止编译器抛出那些恼人的警告 – Perry 2012-03-08 01:17:34

+0

我同意calloc()。我将整个Windows Borland C++ Builder应用程序从calloc转换到malloc,并减少了大量额外的处理和时间。另外,我将普通的lib文件放在预编译的头文件中,这节省了大量的编译时间。当我将#include 添加到我的预编译头文件并且禁止显式(char *)强制转换时,出现错误“[C++ Error] formName.cpp(770):E2034无法将'void *'转换为'char *'” – 2012-03-09 19:36:43

+0

是否缺少显式(char *)转换为malloc()指针仅输出C中的警告,但C++中有错误? – 2012-03-09 19:38:39