2012-03-08 79 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