分配和释放指针指针
问题描述:
我试图将一个指针(char **)的指针传递给一个将初始化它的函数,然后将它传递到另一个将释放内存的函数,但是我在释放上获得seg错误,这导致我相信我的分配出错了。分配和释放指针指针
Valgrind正在报告在该生产线上使用未经初始化的价值。 tmp [i]指向0x0。
if(tmp[i]) free((char*)tmp[i]);
下面是代码(这仅仅是测试代码)
void
alloc_strings(char ***test, int count)
{
char **tmp = *test;
tmp = malloc(count * sizeof(char*));
int i;
for(i = 0; i < count; i++) {
tmp[i] = malloc(6);
strcpy(tmp[i],"Hello");
}
}
void
free_strings(char ***test, int count)
{
char **tmp = *test;
int i;
for(i = 0; i < count; i++) {
if(tmp[i]) free((char*)tmp[i]);
}
if(tmp)
free(tmp);
}
,并且在调用:
int
main(int argc, char **argv)
{
char **test;
alloc_strings(&test, 10);
free_strings(&test, 10);
return 0;
}
我一直在玩这个有一段时间了,阅读起来指针等,但无法让我的头解决这个问题。任何想法非常感谢!
答
您需要分配给*test
,而不是从它进行分配。如何:
void
alloc_strings(char ***test, int count)
{
char **tmp = malloc(count * sizeof *tmp);
/*...*/
*test = tmp;
}
答
在代码示例,
alloc_strings(char ***test, int count)
{
char **tmp = *test;
*test
应该有一些空间来存储指向目前未分配char **
。因此,如果例子是,因为这
char** array[1];
alloc_strings(&array[0], 7);
我觉得代码将工作。
正好。两次(也在析构函数中) – wildplasser 2013-02-10 14:58:02
@wildplasser我认为析构函数很好,只是有点过于复杂。 – cnicutar 2013-02-10 14:59:16
这很好(它破坏了......),但你希望它在返回之前设置'* test = NULL;'。 (顺便说一句:构造函数有潜在的内存泄漏,如果*测试恰好指向先前分配的数组) – wildplasser 2013-02-10 15:02:31