我需要释放一系列指针。所以我设置了一个简单的容易出错的例子,说明我要做的事情。
int main() {
char ** strings = malloc(2);
strings[0] = malloc(sizeof(char)*4);
strings[1] = malloc(sizeof(char)*4);
strings[0] = "ABCD";
strings[1] = "EFGH";
free(strings[1]);
}
我相信我需要以相反的顺序释放指针,所以我从索引一开始。 但是我收到了这个错误:
free(): invalid pointer: 0x0000000000400d49 ***
像[{1}}这样的释放会清除索引零,但是再次调用它会引发错误:
free(strings);
擦除此指针数组的正确方法是什么?或者如果我创建阵列的方式有问题,请告诉我。
答案 0 :(得分:8)
strings[0] = "ABCD"
用指向字符串文字"ABCD"
的指针替换指向已分配内存的指针。你没有为此分配内存,所以无法释放它。
使用
strcpy(strings[0], "ABCD");
复制到你分配的内存中。
请注意,这里仍然会有另外两个问题。首先,您需要为strings
数组中的两个指针分配空间 - 您当前只分配2个字节。其次,"ABCD"
需要5个字节的存储空间(第5个字节用于nul终结符)。因此,您需要为每个数组分配5个字节,或者更好的是,使用strdup(Posix而不是C标准函数)组合分配和字符串复制
char ** strings = malloc(2 * sizeof(*strings));
strings[0] = strdup("ABCD");
strings[1] = strdup("EFGH");
答案 1 :(得分:2)
int main() {
char ** strings = malloc(sizeof(char*)*2);
strings[0] = malloc(sizeof(char)*5);
strings[1] = malloc(sizeof(char)*5);
strcpy(strings[0], "ABCD");
strcpy(strings[1], "EFGH");
free(strings[0]);
free(strings[1]);
free(strings);
return 0;
}
答案 2 :(得分:0)
此代码strings[0] = "ABCD";
未达到预期效果。
不是将字节复制到分配的数组,而是会出现内存泄漏。您重新分配strings[0]
以指向等于"ABCD"
的字符串文字(因此分配的数组被泄露)。这就是为什么在free
上调用strings[1]
失败的原因。你需要做的是使用strcpy:
strcpy(strings[0], "ABCD");
strcpy(strings[0], "EFGH");