释放双指针

时间:2012-08-27 17:16:13

标签: c memory-management malloc free

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);

我只是尝试过这个...即使我将数组释放,因为我将其复制了...我也复制了data[2]的值而没有指向它...所以这不应该是问题...

4 个答案:

答案 0 :(得分:3)

您正在尝试将字符串"0""1"等复制到data数组中:您不能只使用=复制字符串,我需要使用像strcpy这样的字符串库方法。

一旦为数组元素分配了那些文字字符串,例如:data[0]= "0"; ,数组元素就不再指向您已分配的内存,它们指向不属于您的内存,并且你不能使用free。您已从malloc丢失了对内存块的引用,导致内存泄漏。

此外,您无法执行free(data);,因为它未使用malloc分配:它是在堆栈上分配的数组。

答案 1 :(得分: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 */

答案 2 :(得分:1)

使用data[0]= "0",您将覆盖malloc返回的任何malloced地址。 你应该做的是

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

答案 3 :(得分:1)

首先,在分配之后分配给数据元素泄漏先前分配的内存。分配char *时,只分配char *:它不复制字符串,它会覆盖指针。

其次,您释放堆栈上声明的数据。您可以使用以下内容定义数据:

char *data[size_of_daten];

这描述了一个字符串指针的堆栈数组。当你的函数返回时它会超出范围,手动释放它会爆炸。