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

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

我一直对此感到好奇 - 为什么在C ++中我必须从mallocC而不是在C中转换返回值?

以下是C ++中的示例:

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

以下是C ++中不起作用的示例(无转换):

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

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

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


白板的微信
浏览 1030回答 3
3回答

qq_遁去的一_1

几点:C允许将void指针隐式转换为任何其他对象指针类型。C ++没有。malloc()如果您忘记包含stdlib.h或者malloc()在范围内没有声明,则在C中转换结果将会产生有用的诊断。请记住,如果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,没有这种严格的铸造规则; 你可以愉快地在任何两种类型之间进行投射,而你作为程序员负责确保不会发生任何不良事件。

catspeake

C支持从void*其他指针类型隐式转换。C ++不允许它。在C中明确强制转换返回值的一个原因malloc是,如果malloc签名未包含在当前编译单元中,编译器将假定返回类型是int隐式转换为指针类型你是在编译时警告中分配结果,您将立即解决。通过明确的演员表,如果你犯了这个错误,就不会发出任何警告。
打开App,查看更多内容
随时随地看视频慕课网APP