带有C参数的free()语法

时间:2014-10-04 12:39:46

标签: c syntax malloc free

我正在努力将许多C程序从Unix转换为Linux,这种free()语法引起了我的注意:

free((char *) area );

这与free( area );之间的区别是什么?

3 个答案:

答案 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限定是指针的属性,而不是它指向的属性。这是一个重要的区别。