C语言 How to malloc char** table?



我正在尝试malloc并释放单个字母字符串的小数组/表。我知道这可以在数组中完成,但我想尝试用malloc和free来完成。

我现在有这个:

char **letters = (char**) malloc(5 * sizeof(char*));
int i =0;
for(i=0; i < NUMLETTERS ; ++i )
{
    letters[i] = (char*) malloc(2*sizeof(char)); //2 is for the letter and null terminator
}
letters[0] = "a";
letters[1] = "b";
letters[2] = "c";
letters[3] = "d";
letters[4] = "e";
//Do stuff here
int i =0;
for(i=0; i < 5; ++i )
{
    free(letters[i]);
}

free(letters);

上面的代码编译得很好,我的代码在两者之间也工作和运行得很好,但在运行时,它在自由部分得到一个错误。此外,在使用valgrind..之后,它说free(字母[i]);是无效的。

帮忙吗?

问题就在这里:

letters[0] = "a";
letters[1] = "b";
letters[2] = "c";
letters[3] = "d";
letters[4] = "e";

您正在用字符串字面值覆盖每个malloc指针。然后在最后一个循环中释放它们。由于您有效地释放了字符串字面值,因此它失败了。

有两种方法可以解决这个问题:

1:如果你只是给它们分配字符串字面值,你不需要内部分配。所以去掉两个循环

2: strcpy代替每个字符串字面值

您正确地为数组中的每个字符串分配内存,但随后您没有使用该内存。相反,您将更改五个数组元素中的每个char*指针,使其指向字符串字面值"a","b","c"等。

所以,你已经丢失了对你分配的原始内存的引用,而你却试图释放不属于你的内存。

而不是像这样赋值字符串指针:

letters[0] = "a";

应该将字符串复制到分配的内存中,像这样:

strncpy(letters[0], "a", 2);

最新更新