释放结合双指针的结构

时间:2018-01-31 17:51:05

标签: c struct

假设我的结构定义如下:

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

然后,根据我的教科书,免费功能应如下所示:

void puzzle_free(puzzle** puzzle) 

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

2 个答案:

答案 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