我正在努力将许多C程序从Unix转换为Linux,这种free()语法引起了我的注意:
free((char *) area );
这与free( area );
之间的区别是什么?
答案 0 :(得分:17)
free
的签名是:
void free(void *ptr);
因此,如果area
是由malloc
或其堂兄弟返回的指针类型,则free((char *) area );
中的转换毫无意义。
除非......如果代码真的非常老,那就是在 ANSI C 引入void *
作为通用指针之前。在那个古老的时代,char *
被用作通用指针。
答案 1 :(得分:15)
如果有人在标准认可的非指针类型中存储指向动态分配数据的指针,例如area
被声明为intptr_t
,则会将非指针强制转换为指针输入并允许它被释放。
如果area
已经是一个指针类型,那么在过去四分之一世纪中编写的任何C代码都毫无意义。
答案 2 :(得分:1)
标准中free()
的签名是错误的。应该void free(const void *);
才能真正正确。这样做的结果是,当您想要在没有警告的情况下释放const *
时,您必须向上转发。{/ p>
有a Linus Torvald rant about on why free()
should take a const *
。
const
对指针指向的内存有任何影响,即指针指向只读记忆。这显然是错误的。 const
限定是指针的属性,而不是它指向的属性。这是一个重要的区别。