繁体   English   中英

释放包含双指针的结构

[英]Freeing struct that cointains double pointer

说我有一个结构定义如下:

typedef struct {
int width;
int height;
char **data;
} puzzle;

然后,根据我的教科书,free函数应如下所示:

void puzzle_free(puzzle** puzzle) 

但是我不明白为什么拼图应该在自由函数中成为双指针。

好吧,这取决于。 如果这样做的话

puzzle **a = malloc(sizeof *a * NUMITEMS);
for(size_t i = 0; i < NUMITEMS; i++)
   a[i]= malloc(sizeof *a[i] * NUMITEMS);

那么免费当然可以是这样。 myfree(&puzzle); -签名为myfree(puzzle *** a)

那只要你有这个

puzzle* a = malloc(sizeof *a *NUMITEMS);

然后myfree(&a) (包含双指针的签名)就足够了。 这取决于您要释放的内容。

void myfree(puzzle **a){
    free(*a);
}

这本书提到的方式-可以肯定地说,这本书使用了上面第二部分所示的分配方式。 您必须传递它的地址,因为否则您将对本地变量进行更改。 (这就是为什么书中提到需要双指针的原因)。

它可能与该结构中包含的双指针无关,而只是编写有助于防止释放后访问的释放函数的一种方式。
尤金 在他的评论中提到了它。

puzzle_free的实现为:

void puzzle_free(puzzle** puzzle_p) {
    puzzle *puzzle = *puzzle_p
    // Somehow free puzzle->data
    free(puzzle);
    *puzzle_p = NULL;
}

用法将是:

puzzle *puzzle = malloc(...)
// Fill it, use it.
puzzle_free(&puzzle);
// puzzle pointer is now NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM