C - 释放双指针


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] %sn",data[2]);
strcpy(normal_Pointer,data[2]);
for(i=0; i<size_of_daten; i++) {
   free(data[i]);
}
free(data);

我刚刚试过这个...甚至我在错误定位时释放了数组......我也复制了data[2]的值,并没有指向它......所以这不应该是问题...

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

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

此外,你不能做free(data);因为它不是使用 malloc 分配的:它是在堆栈上分配的数组。

这不是

将数据复制到之前分配的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 */

有了data[0]= "0",您将覆盖malloc返回的任何错误地址。相反,你应该做的是

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

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

其次,您正在释放堆栈上声明的数据。 您可以使用以下命令定义数据:

char *data[size_of_daten];

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

相关内容

  • 没有找到相关文章