假设我的结构定义如下:
typedef struct {
int width;
int height;
char **data;
} puzzle;
然后,根据我的教科书,免费功能应如下所示:
void puzzle_free(puzzle** puzzle)
但我不明白为什么拼图应该是自由函数中的双指针。
答案 0 :(得分:1)
那取决于。如果你这样做了,
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);
}
这本书提到的方式 - 可以说这本书使用了上面第二部分所示的那种分配方式。您必须传递它的地址,否则您将更改本地变量。 (这就是书中提到的双指针的原因)。
答案 1 :(得分:1)
它可能与结构中包含的双指针无关,但它只是一种编写自由函数的方法,有助于防止在空闲后访问。
Eugene Sh。在他的评论中提到它。
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