2012-11-24 135 views
0

我在stackoverflow上找到了這個函數,它將兩個字符串連接在一起。這裏是功能:Malloc添加一個初始化字符串concat的字符C

char* concatstring(char *s1,char *s2) 
{ 
char *result = malloc(strlen(s1)+strlen(s2)+1); 
strcpy(result,s1); 
strcat(result,s2); 
return result; 
} 

我的問題是,爲什麼我們加1到malloc調用?

回答

1

您需要分配用於「\ 0」(NULL字符)空間,其用於終止字符串C.

即字符串「貓」,實際上是「貓\ 0」。

+0

相反,「貓」實際上是'{'c','a','t',0}'。「 –

3

這是因爲在C中「字符串」存儲爲字符數組,然後是空字節。這是慣例。因此,空字節可能不會出現在任何C字符串中。

然而,實際的字符串本身不包含空字節(這僅僅是表示字符串的的一部分),所以strlen報告串中非空字節數。要創建連接兩個字符串的結果的C字符串,您因此需要爲空終止符留出空間。

其實,字符串操作都需要用這種或那種方式處理空終止符。不幸的是,細節因功能而異(例如snprintf做得不對,但strncpy是危險地不同),並且您應該仔細閱讀每個功能的手冊以瞭解誰負責空終止符以及如何處理。

0

如果字符串爲 「貓」:

char * mystring = "cat"; 

然後strlen的(MyString的),會返回3

但在現實中它需要4個字節存儲的MyString,用一個字節存儲空字符。所以如果你有兩個字符串,「狗」和「貓」,它們的長度將是3和3,儘管存儲它們所需的字節數將是4。存儲其級聯所需的內存將爲3 + 3 +1 = 7.

因此,malloc中的1將分配額外的字節來存儲空字符。