分配和释放指针指针

问题描述:

我试图将一个指针(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; 
} 
+0

正好。两次(也在析构函数中) – wildplasser 2013-02-10 14:58:02

+0

@wildplasser我认为析构函数很好,只是有点过于复杂。 – cnicutar 2013-02-10 14:59:16

+0

这很好(它破坏了......),但你希望它在返回之前设置'* test = NULL;'。 (顺便说一句:构造函数有潜在的内存泄漏,如果*测试恰好指向先前分配的数组) – wildplasser 2013-02-10 15:02:31

在代码示例,

alloc_strings(char ***test, int count) 
{ 
    char **tmp = *test; 

*test应该有一些空间来存储指向目前未分配char **。因此,如果例子是,因为这

char** array[1]; 

alloc_strings(&array[0], 7); 

我觉得代码将工作。