例如,如果我想编写一个“免费”的程序来清空指针,我可以写出以下代码:
然而,当我尝试编写此代码时,我收到一个编译器警告(来自gcc 4.6.2),指出:
void myfree(void **data) {
free(*data);
*data = NULL;
}
然而,当我尝试编写此代码时,我收到一个编译器警告(来自gcc 4.6.2),指出:
warning: passing argument 1 of ‘myfree’ from incompatible pointer type [enabled by default] ... note: expected ‘void **’ but argument is of type ‘char **‘
(在这种情况下,我正在释放一个char数组)。看起来void*
被特殊处理以避免这种警告,因为calloc
、free
等不会触发这样的警告,但是void**
没有(根据上述内容)。唯一的解决方案是显式转换,还是我误解了什么?[我正在重新审视最近项目中的一些痛点,思考如何更好地处理它们,因此在探究边角案例,所以今天问了这些C语言问题。]更新:鉴于void*
被特殊处理,我可以使用void*
和在myfree
内部进行强制转换来绕过这个问题,但这将是一种不负责任的解决方案,因为每个人都会传递一个类似于free
的指针,因此我需要一种基于“间接程度”的编译器警告才能实现实际解决方案。因此,我想到了一个通用的“指向指针”的想法。
void**
。 - Daniel Fischerfree
不需要它时。因此想知道是否有更好的方法。 - andrew cooke