2012-08-27 142 views
0
int size_of_daten = 5; 
char *data[size_of_daten]; 
char *normal_Pointer = (char*)malloc(sizeof(char) * 100); 
int i; 

for(i=0; i<size_of_daten; i++) { 
    data[i] = (char*)malloc(sizeof(char) * 100); 
} 

data[0] = "0"; 
data[1] = "1"; 
data[2] = "2"; 
data[3] = "3"; 
data[4] = "4"; 

printf("data[2] %s\n",data[2]); 

strcpy(normal_Pointer,data[2]); 

for(i=0; i<size_of_daten; i++) { 
    free(data[i]); 
} 

free(data); 

我只是嘗試這樣做......即使我釋放數組作爲我malloced它...我也抄data[2]的價值和它沒有一點......讓不該」 T代表問題...釋放的雙指針

回答

3

你試圖琴絃"0""1"等複製到您的data數組:你不能只用=複製的字符串,你需要使用一個字符串庫方法如strcpy

一旦你給數組元素分配了這些文字字符串,例如:data[0]= "0"; ,數組元素不再指向你分配的內存,它們指向不屬於你的內存,你可以' t使用free。您從malloc中失去了對內存塊的引用,導致內存泄漏。

此外,您不能執行free(data);,因爲它沒有使用malloc進行分配:它是在堆棧上分配的數組。

+0

thx ...明白了...... – Fendrix

+0

是否有任何方式來釋放例如數據[0] =「0」; ...或者只是指向NULL ...猜測不是在c有沒有垃圾回收器 – Fendrix

+0

爲您管理文字字符串的內存:通常它是可執行文件的_data_部分的一部分,因此屬於只讀內存。所以他們會在你的程序的一生中存在。只管理你使用'malloc'分配自己的內存等。 – pb2q

3

這不是你如何將數據複製到的char秒的陣列您以前分配:

data[0]= "0"; 
data[1]= "1"; 
data[2]= "2"; 
data[3]= "3"; 
data[4]= "4"; 

覆蓋指針與5個新指針的地址。此時,您已經丟失了分配的內存地址,當您撥打free時,您將在靜態分配的字符串"0"上調用該地址。

您需要使用strcpy從一個字符數組複製字節到另一個:

strcpy(dest[0], "0"); 
strcpy(dest[1], "1"); 
/* etc */ 
+0

thx ...明白了...... – Fendrix

1

隨着data[0]= "0"要覆蓋由malloc返回任何malloced地址。 什麼,你應該做的,而不是爲

strcpy(data[0], "0"); 
strcpy(data[1], "1"); 
... 
1

首先,分配到數據的泄露分配以前分配的內存後的元素。當你分配一個char *時,你只分配char *:它不復制字符串,它會覆蓋指針。

其次,您將釋放堆棧中聲明的數據。您用以下數據定義數據:

char *data[size_of_daten]; 

這描述了一個字符指針堆疊數組。當函數返回時它會超出範圍,並且手動釋放它將會炸燬。