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

我刚试过这个......即使我在分配数组时释放了它......我也复制了它的值data[2]并且没有指向它......所以这不应该是问题......

4

4 回答 4

3

您正在尝试将 strings "0""1"等复制到您的data数组中:您不能只用于=复制字符串,您需要使用字符串库方法,例如strcpy.

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

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

于 2012-08-27T17:17:55.673 回答
3

这不是您将数据复制到char先前分配的 s 数组中的方式:

data[0]= "0";
data[1]= "1";
data[2]= "2";
data[3]= "3";
data[4]= "4";

您正在用 5 个新指针的地址覆盖指针。此时,您已经丢失了分配的内存地址,当您调用时,free您是在静态分配的 string 上调用它"0"

您需要使用strcpy将字节从一个字符数组复制到另一个:

strcpy(dest[0], "0");
strcpy(dest[1], "1");
/* etc */
于 2012-08-27T17:18:23.917 回答
1

data[0]= "0"您一起覆盖任何由malloc. 你应该做的是

strcpy(data[0], "0");
strcpy(data[1], "1");
...
于 2012-08-27T17:19:50.783 回答
1

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

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

char *data[size_of_daten];

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

于 2012-08-27T17:21:40.203 回答