我一直对此感到好奇 - 为什么在 C++ 中我必须转换返回值malloc
但不是C语言?
下面是 C++ 中有效的示例:
int *int_ptr = (int *)malloc(sizeof(int*));
下面是 C++ 中的示例,该示例不起作用(无强制转换):
int *int_ptr = malloc(sizeof(int*));
我听说在 C 中,事实上,从malloc()
是一个错误。
有人可以评论这个话题吗?
几点:
C 允许 void 指针隐式转换为任何其他对象指针类型。 C++ 没有。
铸造结果malloc()
如果您忘记包含 stdlib.h 或者没有声明,C 中将抑制有用的诊断malloc()
在适用范围。请记住,如果 C 看到没有事先声明的函数调用,它将假定该函数返回int
。如果您没有声明malloc()
如果您放弃强制转换,您将得到一个诊断结果,表明您正在尝试分配不兼容的类型(int 到指针)。如果转换结果,则会抑制诊断,并且可能会出现运行时问题,因为不能保证将指针值转换为 int 并再次转换回指针会给您提供有用的结果。
如果你正在编写 C++,你应该使用new
and delete
代替malloc()
and free()
。是的,是的,是的,我听说过人们希望他们的代码同时编译为 C 和 C++ 的所有原因,但在我看来,为该语言使用正确的内存管理工具的好处超过了维护两个版本的成本。
注:void *
C89标准中增加了type; C 的早期版本有malloc()
return char *
,所以在那些版本中演员was如果要将结果分配给不同的指针类型,则需要此参数。不过,几乎每个人都至少支持 C89 标准,因此您遇到这些较旧的实现之一的可能性非常非常低。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)