为什么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 ++,你应该使用new
和delete
来代替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您将立即解决的编译时警告分配给结果。 明确的演员表示,如果你犯了这个错误,将不会发出警告。