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];
这描述了字符指针的堆栈数组。 当您的函数返回时,它将超出范围,手动释放它会爆炸。