2009-12-02 75 views
1

以下兩個片段之間是否有區別? 一個是char數組,而另一個是字符數組指針,但它們的行爲相同,不是嗎?字符數組問題C++

實施例1:

char * transport_layer_header; 
// Memory allocation for char * - allocate memory for a 2 character string 
char * transport_layer_header = (char *)malloc(2 * sizeof(char)); 
sprintf(transport_layer_header,"%d%d",1,2); 

實施例2:

char transport_layer_header[2]; 
sprintf(transport_layer_header,"%d%d",1,2); 
+1

你可能會考慮使用'snprintf'而不是'sprintf';前者提供邊界檢查以確保不會超出目標數組。 – 2009-12-02 18:17:48

+3

您需要爲2個字符的字符串分配3個字符,以計算結尾的空值。 – 2009-12-02 18:24:34

+0

注意點。謝謝。 – halluc1nati0n 2009-12-02 18:30:05

回答

12

是的,是有區別的。在第一個示例中,您在堆上動態分配兩元素字符數組。在第二個例子中,你在棧上有一個本地的兩元素字符數組。

在第一個示例中,由於您沒有free指針返回malloc,所以您還有內存泄漏。

它們通常可以以相同的方式使用,例如使用sprintf,正如您演示的那樣,但它們根本不同。

+0

作爲後續,由於'malloc'需要在堆上查找可用內存,通常會採用信號量。如果此代碼位於ISR或其他關鍵部分中,則會導致可能出現的問題。使用堆棧的速度要快得多,因爲編譯器只是將「分配」作爲堆棧指針的一個附加部分,這也意味着無需擔心。 – jheddings 2009-12-02 18:17:41

5

另一個區別是,你的第一個例子會破壞堆上的數據,而第二個例子會破壞堆棧上的數據。爲末尾的\ 0分配空間。

3

最重要的區別,國際海事組織,是在第二個選項transport_layer_header是常量指針(你不能將它指向一個不同的地方),其中在第一個選項 - 你可以。

除了之前的答案之外,這是當然的。

1

假設你糾正了「空間不足」問題,即分配3個字節而不是2個,如果需要動態內存,通常只使用malloc()。例如,如果你不知道數組的大小,你可以使用malloc。

正如所指出的,如果你malloc()並且以後不釋放內存,那麼你就有內存泄漏。

還有一點:你真的應該檢查malloc()的返回值以確保你獲得了內存。我知道在Solaris中,malloc()永遠不會失敗(認爲它可能會睡眠 - 如上所述,如果不想讓進程進入休眠狀態,不要調用它)。我認爲在Linux上malloc()可能會失敗(即如果沒有足夠的內存可用)。 [請糾正我,如果我錯了。]