为什么C ++需要一个malloc()强制转换,但C不?

我一直对此感到好奇 – 为什么在C ++中我必须从malloc投入返回值,但不是在C中?

以下是C ++中的示例:

 int *int_ptr = (int *)malloc(sizeof(int*)); 

这里是C + +的例子,不工作(不投):

 int *int_ptr = malloc(sizeof(int*)); 

我听说在C中,实际上,从malloc()输出一个输出是一个错误。

任何人都可以评论这个话题吗?

几点:

C允许void指针被隐式转换为任何其他的对象指针types。 C ++没有。

如果忘记包含stdlib.h,或者没有在范围内声明malloc() ,则在C中将malloc()的结果强制转换为压缩的诊断结果将抑制有用的诊断。 请记住,如果C在没有事先声明的情况下看到一个函数调用,它将假定函数返回int 。 如果你没有malloc()的声明,并且你离开了强制转换,你会得到一个诊断,你试图分配不兼容的types(int指针)。 如果你输出的结果是压缩了诊断,并且可能会有运行时问题,因为不能保证将指针值转换为int并返回到指针会给你一个有用的结果。

如果你正在编写C ++,你应该使用newdelete来代替malloc()free() 。 是的,是的,是的,我听说过人们希望他们的代码能够同时编译为C和C ++的所有原因,但是使用正确的内存pipe理工具为语言带来的好处超过了维护两个版本IMO的成本。

注意: void *types是在C89标准中添加的; 早期版本的C有malloc()返回char * ,所以在这些版本中,如果将结果分配给不同的指针types, 需要强制转换。 几乎每个人都至less支持C89标准,所以你遇到这种老版本的几率是非常低的。

那是因为C ++是一种强types语言。 在C ++中,隐式转换只有在“扩展”的情况下才被允许,也就是说,如果新types可以保存旧types可以容纳的每个值。 允许从较小的整数types转换为较大的整数types; 从任何指针types转换为void*是允许的; 允许从子类转换到其超类。 所有其他的演员都必须明确expression,从而告诉编译器“我知道我在做什么,这不是一个错误”。

malloc()返回一个void* ,它可以是任何东西,所以编译器不能保证你的转换会成功(或者是有意义的)。 通过使用明确的转换,你告诉编译器,你在做什么实际上是有意的。

C,OTOH,没有这样严格的铸造规则; 你可以高兴地在任何两种types之间进行投射,而作为程序员的你也要负责确保没有不好的事情发生。

C支持从void*到其他指针types的隐式转换。 C ++不允许它。

在C中明确地malloc的返回值的一个原因是,如果malloc签名不包含在当前编译单元中,编译器将假定返回types是int并将其隐式转换为指针types您将立即解决的编译时警告分配给结果。 明确的演员表示,如果你犯了这个错误,将不会发出警告。