为什么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指针隐式转换为任何其他对象指针类型。 C ++没有。
如果忘记包含stdlib.h,或者没有在范围内声明malloc()
,则在C中将malloc()
的结果强制转换将抑制有用的诊断。 请记住,如果C在没有事先声明的情况下看到一个函数调用,它将假定该函数返回int
。 如果你没有malloc()
的声明,并且你离开了强制转换,你会得到一个诊断结果,你试图分配不兼容的类型(int指向指针)。 如果你输出了结果,你会抑制诊断并且可能会有运行时问题,因为不能保证将指针值转换为int并返回到指针会给你一个有用的结果。
如果你正在编写C ++,你应该使用new
和delete
来代替malloc()
和free()
。 是的,是的,是的,我听说过人们希望他们的代码能够同时编译为C和C ++的所有原因,但是使用正确的内存管理工具为语言带来的好处超过了维护两个版本IMO的成本。
注意: void *
类型是在C89标准中添加的; 早期版本的C具有malloc()
返回char *
,因此在这些版本中,如果将结果分配给不同的指针类型,则必须执行强制转换。 几乎每个人都至少支持C89标准,所以你遇到这些较早实现的几率非常非常低。
这是因为C ++是一种强类型语言。 在C ++中,隐式强制转换只有在“扩展”时才被允许,也就是说,如果新类型可以保存旧类型可以容纳的每个值。 允许从较小的整数类型转换为较大的整数类型; 从任何指针类型转换为void*
都是允许的; 允许从子类转换到其超类。 所有其他演员必须明确制作,从而告诉编译器“我知道我在做什么,这不是一个错误”。
malloc()
返回一个void*
,它可以是任何东西,所以编译器不能保证你的转换会成功(或有意义)。 通过使用明确的转换,你告诉编译器你正在做的事实际上是有意的。
C,OTOH,没有这样严格的铸造规则; 你可以高兴地在任何两种类型之间进行投射,而你作为程序员负责确保没有不好的事情发生。
C支持从void*
到其他指针类型的隐式转换。 C ++不允许它。
在C中明确转换malloc
返回值的原因之一是,如果malloc
签名未包含在当前编译单元中,编译器将假定返回类型为int
并将其隐式转换为指针类型您将立即分配给编译时警告的结果。 在明确演员的情况下,如果你犯了这个错误,将不会发出警告。
上一篇: Why does C++ require a cast for malloc() but C doesn't?
下一篇: malloc casting error