2012-08-27 45 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]; 

这描述了一个字符指针堆叠数组。当函数返回时它会超出范围,并且手动释放它将会炸毁。