我很久没有使用过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。
答案 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
,因此您会收到“请求某个非结构的成员”错误。 “不是结构的东西”是指向结构的指针。