2011-11-13 52 views
3

我很久没有使用C了,而且我对它还是有点新鲜。我很困惑指针和引用的语法。基本上我有一个指针结构容器,我动态地分配为数组。当我完成它时,我想知道如何释放这些记忆。下面是它的样子:如何从结构中释放动态分配的内存?

typedef struct { 
    int* foo; 
} Bar; 

typedef Bar * BarRef; 

BarRef newBar(int n) { 
    BarRef B = malloc(sizeof(Bar)); 
    B->foo = calloc(n,sizeof(int)); 
} 

/* This is what I am having trouble understanding */ 
void freeBar(BarRef *B) { 
    free(B->foo); 
    B->foo = NULL; 
    free(B); 
    *B = NULL; 
} 

我得到一个编译器错误告诉我,我正在请求一个不是结构体的成员。但我认为传递一个Ref*会消失,所以这将像传递结构。我使用gcc和ANSI C.

回答

7
void freeBar(BarRef * B) { 
    // Here B is a pointer to a pointer to a struct Bar. 
    // Since BarRef is Bar * 
    // And B is a BarRef * 
} 

因为要修改的指针,结构bar(设置指针为NULL)你传递一个BarRef *是正确的,但对你的内容程序应该是这样的:

free((*B)->foo); 
(*B)->foo = NULL; 
free(*B); 
*B = NULL; 

(*B)->foo工作如下:

(*B)解引用B,给你一个BarRef(AKA一个Bar *(*B)->foo访问由(*B)指向的条结构中名为foo的元素

B->foo无效。这意味着访问由B指向的条结构中名为foo的元素。由于B未指向条形结构,而是指向pointer to a bar structure,因此会出现“请求不是结构体的某个成员”错误。 “不是结构的东西”是指向结构体的指针。