2010-06-04 128 views
7

是將內存分配給char *的正確方法嗎?將內存分配給char * C語言

char* sides ="5"; 

char* tempSides; 

tempSides = (char*)malloc(strlen(inSides) * sizeof(char)); 
+0

@brickner這個怎麼在strlen的, 的strlen(內部)+ 1 – boom 2010-06-04 05:58:48

回答

14

差不多。字符串是NULL終止的,所以你可能想分配一個額外的字節來存儲NULL字節。也就是說,即使sides是1個字符長,但它確實是2個字節:{5,'\0'}。

因此,這將是:

tempSides = (char *)malloc((strlen(sides)+1)*sizeof(char)); 

,如果你想在複製:

strcpy(tempSides, sides); 
+8

你的意思是 '\ 0' 當你說NULL。 '\ 0'是nul,不是NULL。 – 2010-06-04 05:43:42

+0

請注意乘以sizeof(char)'是不必要的; 'sizeof(char)'被定義爲1. – caf 2010-06-04 05:45:54

+2

@caf:是的,但省略它會使代碼很難在必要時適應wchar_t或TCHAR - 如果沒有乘法運算,就有可能忘記使用它。 – sharptooth 2010-06-04 05:50:20

1

有一個問題這一點。 tempSides將指向大小爲1的未初始化的內存塊。如果您打算將邊串複製到tempSides中,則需要將一個大小再分配一個字節,以保存字符串的零終止符。 strlen()返回的值不包含字符串末尾的零終止符。

1

不,不是真的。正如其他人已經指出的那樣,您需要爲NUL終止符分配空間。

另外,你一般應該而不是malloc投退。它可以掩蓋你忘記了正確頭部的錯誤。乘以sizeof(char)也是毫無意義的,因爲標準(C和C++)定義sizeof(char)始終爲1.

最後,每次調用malloc都應該包括對結果的測試。我包住整個事情成一個功能:

char *dupe_string(char const *string) { 
    char *temp; 
    if (NULL!=(temp=malloc(strlen(string)+1))) 
     strcpy(temp, string); 
    return temp; 
} 
3

正如已經指出的那樣,你錯過了分配終止NUL chararacter空間。但我也想指出其他一些可以讓你的代碼更加簡潔的東西。

根據定義,sizeof(char)始終爲1,這樣可以縮短你的配置行:

tempSides = (char*)malloc(strlen(inSides) + 1); 

另一件事是,這看起來像你在做重複的字符串。有一個內置的功能,可以爲你做到這一點:

tempSides = strdup(inSides); 

這處理獲取長度,分配正確的字節數和複製數據。

9

注意的是:

  1. 字符串是零結尾(\ 0),和strlen的()不進行計數;根據定義,sizeof(char)是1(字節),所以它不是必需的;
  2. 如果您使用C(而不是C++)編譯器,則不需要將其轉換爲char *;

因此,這將是:

char *tempSides = malloc(strlen(inSides) + 1); 

不過,如果你想複製的inSides的內容,你可以使用strdup,如:

char *tempSides = strdup(inSides); 
if (tempSides != NULL) { 
    // do whatever you want... 
    free(tempSides); 
} 
0

乘以元素計數由sizeof(char)是個人喜好的問題,因爲sizeof(char)總是1.但是,如果你這樣做是爲了一致性,最好使用t他是收件人指針類型來確定元素大小,而不是明確指定類型。而隨着你要記住分配額外的空間用於終止零字符零結尾的字符串時不投malloc

tempSides = malloc(strlen(inSides) * sizeof *tempSides); 

當然的結果。在這種情況下,無法說明你是否打算使tempSides爲零終止的字符串,所以我不能說你是否需要它。

+0

沒辦法?他最好在調用'strlen'時使用零終止字符串......如果他使用自己的strlen,那麼我真的不想成爲他後面的維護程序員。 ;) – Secure 2010-06-04 07:38:42

+1

@Secure:這隻意味着'inSides'是零終止的。在代碼中沒有跡象表明'tempSides'也應該是零終止的。 – AnT 2010-06-04 07:43:19

0

分配動態存儲器的正確的方法tempSides如下圖所示:

char* sides ="5"; 
char* tempSides; 
tempSides = (char*)malloc((strlen(sides) + 1) * sizeof(char)); 

char*存儲字符串數據,類似於char[]。字符串是null (\0)終止。因此應該爲null字符存儲分配額外的一個字節。

動態分配的內存塊必須在使用完成後使用free()釋放。如果沒有釋放,則會發生內存泄漏。

free(tempSides); 

一個存儲器被釋放,NULL必須分配給防止它被懸空指針。

tempSides = NULL;