C语言 使用 free 和指向结构的双指针



我试图了解如何使用free函数。在下面的代码片段中,我使用malloc创建ctx

void serve(ctx **some_struct_type) {
// .. some operation
}
int main() {
context_t* ctx = malloc(sizeof(struct context_t));
serve(&ctx);
}

由于每个malloc调用都必须有一个相应的free调用,并且我想在serve内部免费调用,它应该是free((**ctx))还是free((*ctx))

我对必须免费调用的方式有点困惑。

你在 main 中声明了一个指针

context_t* ctx = malloc(sizeof(struct context_t));

要释放主中分配的内存,您可以写入

free( ctx );

但是,您通过引用函数传递了指针serve

serve(&ctx);

因此,要在函数中获取引用的对象(指针(,您必须取消引用声明为函数参数的指针(我将更改函数参数以使函数有意义(

oid serve( context_t **p ) {

那就是你需要写

free( *p );

其中*p是原始对象的lvaluectx

main中,ctx的值是已分配内存块的地址。 正是这个值传递给free.

如果将ctx的地址传递给函数,则需要取消引用该指针以获取从malloc获取的指针值。

因此,假设函数声明为:

void serve(struct context_t **ctx) {

您希望free(*ctx)此函数内部。

>malloc函数用于在程序执行期间分配一定量的内存。它向操作系统发送请求,如果可能,操作系统将从堆中保留请求的内存量。(该函数返回已分配空间的地址(

+-------+------------------+------+----------------------+
| stack | -> free space <- | heap | data & code segments |
+-------+------------------+------+----------------------+

free以另一种方式工作,它获取指向某个内存块的地址(引用(并解除分配它。

如果您希望在 main 中解除分配它,您可以这样做:

int main() {
context_t* ctx = malloc(sizeof(struct context_t));
free(ctx);
}

但是由于您要将其转换为双指针(指针到指针(,因此您需要将其取消引用回您分配的地址:

int main() {
context_t* ctx = malloc(sizeof(struct context_t));
ctx **some_struct_type = &ctx;
free(*some_struct_type);
}

相关内容

  • 没有找到相关文章

最新更新