2011-10-18 36 views
6

我正在嘗試malloc並釋放單個字母字符串的小數組/表格。我知道這可以在數組中完成,但我想嘗試使用malloc和free來完成此操作。如何爲malloc char **表?

我現在有這個權利:

char **letters = (char**) malloc(5 * sizeof(char*)); 
int i =0; 
for(i=0; i < NUMLETTERS ; ++i) 
{ 
    letters[i] = (char*) malloc(2*sizeof(char)); //2 is for the letter and null terminator 
} 

letters[0] = "a"; 
letters[1] = "b"; 
letters[2] = "c"; 
letters[3] = "d"; 
letters[4] = "e"; 

//Do stuff here 

int i =0; 
for(i=0; i < 5; ++i) 
{ 
    free(letters[i]); 
} 


free(letters); 

上面的代碼編譯罰款和我之間也代碼工作和運行正常,但在運行時,它的免費部分時會得到一個錯誤。另外,在使用valgrind之後呢..說的是free(letters [i]);無效。

任何幫助?

回答

5

的問題是在這裏:

letters[0] = "a"; 
letters[1] = "b"; 
letters[2] = "c"; 
letters[3] = "d"; 
letters[4] = "e"; 

您與字符串文字覆蓋每個malloc分配指針。然後你在最後的循環中釋放它們。由於您正在釋放字符串文字,因此失敗。

有兩種方法來解決這個問題:

1:你不需要內部分配,如果你只是指定字符串文字給他們。所以擺脫兩個循環。

2:strcpy而不是每個字符串文字。

+0

啊!我應該這樣做:strcpy(letters [0],「a」);對? – Flipper

+0

正確,這將起作用。 – Mysticial

3

您正確地爲陣列中的每個字符串分配內存,但是您沒有使用該內存。您改爲改變指向字符串文字「a」,「b」,「c」等的五個數組元素中的char*指針。

因此,您已經失去了對原始內存的引用分配,而你卻試圖釋放不屬於你的記憶。

不是指定的字符串指針這樣的:

letters[0] = "a"; 

你應該複製串入內存你分配的,就像這樣:

strncpy(letters[0], "a", 2); 
+0

大小參數應爲2以包含'\ 0'。這裏有一個測試片段來證明我的觀點: 'int main(int argc,char ** argv) { char * str1 =「a」; char str2 [2]; str2 [1] = 0xFF; strncpy(str2,str1,1); printf(「str2 [0] =%x,str2 [1] =%x \ n」,str2 [0]&0xFF,str2 [1]&0xFF); }' –

+0

現在修好了,謝謝。 –