繁体   English   中英

免费2D char数组

[英]Free 2D char array

我需要释放一系列指针。 所以我设置了一个简单的容易出错的例子,说明了我要做的事情。

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 ***

释放像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");
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;
}

此代码strings[0] = "ABCD"; 没有做你期望的事。

而不是将字节复制到分配的数组,你得到内存泄漏。 您重新分配strings[0]以指向等于"ABCD"字符串文字(因此分配的数组被泄露)。 这就是为什么在strings[1]free调用失败的原因。 你需要做的是使用strcpy:

strcpy(strings[0], "ABCD");
strcpy(strings[0], "EFGH");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM