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]
的值而没有指向它...所以这不应该是问题...
答案 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];
这描述了一个字符串指针的堆栈数组。当你的函数返回时它会超出范围,手动释放它会爆炸。