如何从结构中释放动态分配的内存?

时间:2011-11-13 02:29:30

标签: c pointers

我很久没有使用过C了,我还是有些新手。我对指针和引用的语法感到困惑。基本上我有一个带有指针的struct容器,我将其动态分配为数组。当我完成它时,我想知道如何释放内存。这是它的样子:

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。

1 个答案:

答案 0 :(得分: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 *
}

由于你想要修改一个指向struct Bar的指针(将指针设置为NULL),你传递BarRef *是正确的,但你的过程内容应如下所示:

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

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

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

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