我正在尝试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);