我一直对此感到好奇——为什么在 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++ 需要对 malloc() 进行强制转换,而 C 不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3477741/