C 自由二维字符数组

C 自由二维字符数组,c,arrays,memory,free,C,Arrays,Memory,Free,我需要释放一个指针数组。因此,我建立了一个简单的容易出错的示例来说明我正在尝试做的事情 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]); }

我需要释放一个指针数组。因此,我建立了一个简单的容易出错的示例来说明我正在尝试做的事情

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]);
}
我相信我需要以相反的顺序释放指针,所以我从索引1开始。 但是我得到了这个错误:

free():无效指针:0x0000000000400d49***

free一样释放(字符串)清除索引0,但再次调用它会引发错误:

双重免费或损坏(fasttop):0x00000000008e5010***


清除此指针数组的正确方法是什么?或者如果我创建数组的方式有问题,请告诉我。

此代码
strings[0]=“ABCD”未按预期执行

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;
}
不是将字节复制到分配的数组,而是出现内存泄漏。您重新分配
字符串[0]
以指向等于
“ABCD”
(因此分配的数组泄漏)。这就是在
字符串[1]
上调用
free
失败的原因。您需要做的是使用strcpy:

strcpy(strings[0], "ABCD");
strcpy(strings[0], "EFGH");
将指向已分配内存的指针替换为指向字符串文字的指针
“ABCD”
。您没有为此分配内存,因此无法释放它

使用

复制到您分配的内存中

请注意,这里还有几个问题。首先,您需要为
字符串
数组中的两个指针分配空间-您当前只分配2个字节。其次,
“ABCD”
需要5个字节的存储空间(第5个字节用于nul终止符)。因此,您需要为每个数组分配5个字节,或者更好地使用Posix(而不是C标准函数)将分配和字符串复制结合起来


@用户3121023谢谢。我从问题中复制了这个,没有注意到进一步的错误。现在更正。感谢您指出空终止符,并向我展示了如何正确地为数组分配内存,我现在理解了它的工作原理。我还了解了如何通过复制值来避免此问题。然而,我不明白为什么我需要这样做。你是说
“ABCD”
当前是一个静态常量,因此实际上是只读的吗?@Flosculus在
字符串[0]=“ABCD”中赋值不会将一个字符串的内容复制到另一个字符串中;它只是将指针更改为指向不同的地址。引号内的内容称为字符串文字。此指向的字符串在程序期间可用。它可能是只读的,但不能保证是只读的。考虑内存管理的最佳方式是,对
malloc
的每个调用必须恰好有一个与
free
匹配的调用。你没有
malloc
所以以后不能
释放它。啊,所以我分配的
字符串[0]=malloc(sizeof(char)*4)会被泄露吗?
strings[0] = "ABCD"
strcpy(strings[0], "ABCD");
char ** strings = malloc(2 * sizeof(*strings));
strings[0] = strdup("ABCD");
strings[1] = strdup("EFGH");