c - 免费二维字符数组

标签 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]);
}

我认为我需要以相反的顺序释放指针,所以我从索引 1 开始。 但是我得到这个错误:

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

释放像 free(strings); 清除索引零,但是再次调用它会抛出错误:

double free or corruption (fasttop): 0x00000000008e5010 ***

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

最佳答案

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

关于c - 免费二维字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26848693/

相关文章:

c - C 中的重音/变音字符?

r - 在 R 中使用交换分区

c - ARM GDB 无法仅在 Linux 上访问内存

ruby - 将 ruby​​ 中的数组拆分为多个随机大小的较小数组的最佳方法是什么

java - 数组返回为空而不是数字列表

c - 无法从文件中扫描元素并直接将其放入数组中

c - for循环无故停止

memory - AMD 7970 报告不正确的 DEVICE_GLOBAL_MEM_SIZE

c - Spritesheet 动画与视频渲染

c - 如何理解/可视化指向数组第一个索引的概念数组变量名?