我一直对此感到好奇 - 为什么在C++中我必须从mallocC而不是在C中转换返回值?
以下是C++中的示例:
int *int_ptr = (int *)malloc(sizeof(int*));
Run Code Online (Sandbox Code Playgroud)
以下是C++中不起作用的示例(无转换):
int *int_ptr = malloc(sizeof(int*));
Run Code Online (Sandbox Code Playgroud)
我听说在C中,事实上,输出输出malloc()是一个错误.
任何人都可以评论这个话题吗?
Joh*_*ode 34
几点:
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标准的,所以你的赔率运行到那些旧的实现是非常非常低的一个.
tda*_*ers 13
那是因为C++是一种强类型语言.在C++中,只有在"扩展"时才允许隐式强制转换,也就是说,如果新类型可以包含旧类型可以容纳的每个值.允许从较小的整数类型转换为较大的整数类型; void*允许从任何指针类型转换; 允许从子类转换为其超类.所有其他演员必须明确制作,从而告诉编译器"我知道我在做什么,这不是一个错误".
malloc()返回一个void*,可能是任何东西,所以编译器不能保证你的演员会成功(或有意义).通过使用显式强制转换,您告诉编译器您正在做的事情实际上是有意的.
C,OTOH,没有这种严格的铸造规则; 你可以愉快地在任何两种类型之间进行投射,而你作为程序员负责确保不会发生任何不良事件.
C支持从void*其他指针类型隐式转换.C++不允许它.
在C中明确强制转换返回值的一个原因malloc是,如果malloc签名未包含在当前编译单元中,编译器将假定返回类型是int隐式转换为指针类型你是在编译时警告中分配结果,您将立即解决.通过明确的演员表,如果你犯了这个错误,就不会发出任何警告.