释放指针指向的所有内存space?

Deallocating all memory space that the pointer to pointer points to?

我对释放指针指向的所有内存space感到困惑。

比如有一个指向指针的指针如下:

int **p;                      //  +-----+      +-----+      +-----+-----+-----+
p  = malloc(sizeof(int*));    //  |  p  |----->|     |----->|     |     |     |
*p = calloc(3, sizeof(int));  //  +-----+      +-----+      +-----+-----+-----+

据我所知,释放所有内存 space 的正确方法是

free(*p);
free(p);   // The order is unchangeable.

void free (void* ptr)释放ptr指向的内存space,但是p是指向指针的指针,所以为什么不用free((void*)p)释放内存[=15] =] 而不是使用 free(p)?

void * 是通用指针,即它可以指向任何指针类型。无需投 p.

"So why not use free((void*)p) to deallocate memory space instead of using free(p)?"

因为p是一个指针。一个指针一个指针,我给你。但是一个指针都是一样的!

如果你有一个用来装盒子的盒子,它仍然是一个盒子。一个盒子的盒子。

如果规则是 "All pointer types can be implicitly cast to void* unless they point to a pointer type"!

那就太奇怪了