我正在将许多C程序从Unix转换为Linux,这个free()语法引起了我的注意:
free((char *) area );
这和free( area );
有什么区别?
free
的签名为:
void free(void *ptr);
因此,如果area
是由malloc
或其表亲返回的指针类型,则free((char *) area );
中的转换毫无意义。
除非。。。如果代码真的非常旧,也就是说,在ANSI C引入void *
作为通用指针之前。在古代,char *
被用作通用指针。
如果有人将指向动态分配数据的指针存储在标准认可的非指针类型中,即area
被声明为intptr_t
,则将非指针强制转换为指针类型并允许释放。
如果area
已经是一个指针类型,那么对于上个25世纪编写的任何C代码来说,这都毫无意义。
标准中free()
的签名错误。应该是void free(const void *);
才是真正正确的。这样做的结果是,当您想在没有警告的情况下释放const *
时,必须向上广播它。
关于为什么free()
应该取const *
,有一个Linus Torvald的咆哮。
编辑:这个问题之所以有争议,根本原因是人们通常认为const
与指针指向的内存有任何关系,即指针指向只读内存。这显然是错误的。const
限定是指针的属性,而不是它所指向的对象的属性。这是一个重要的区别。