我一直对此很好奇-为什么在C++中我必须从malloc
开始转换返回值,而在C中却不是?
下面是C++中的例子:
int *int_ptr = (int *)malloc(sizeof(int*));
这里是C++中不工作的例子(没有强制转换):
int *int_ptr = malloc(sizeof(int*));
我听说在C语言中,实际上,从malloc()
开始计算输出是一个错误.
有没有人能对这个话题发表 comments ?
我一直对此很好奇-为什么在C++中我必须从malloc
开始转换返回值,而在C中却不是?
下面是C++中的例子:
int *int_ptr = (int *)malloc(sizeof(int*));
这里是C++中不工作的例子(没有强制转换):
int *int_ptr = malloc(sizeof(int*));
我听说在C语言中,实际上,从malloc()
开始计算输出是一个错误.
有没有人能对这个话题发表 comments ?
有几点:
C允许将void指针隐式转换为任何其他对象指针类型.C++没有.
如果你忘了包括stdlib,在C中投射malloc()
的结果将压制一个有用的诊断.h或其他情况下,范围内没有malloc()
的声明.请记住,如果C看到一个函数调用没有事先声明,它将假定该函数返回int
.如果您没有malloc()
的声明,并且没有强制转换,那么您将得到一个诊断,大意是您正在try 分配不兼容的类型(int到指针).如果强制转换结果,则会禁用诊断,并且可能会出现运行时问题,因为不能保证将指针值转换为int并再次转换为指针会得到有用的结果.
如果您正在编写C++,您应该使用new
和delete
,而不是malloc()
和free()
.是的,我听说了人们希望他们的代码同时编译为C和C++的所有原因,但是为该语言使用正确的内存管理工具的好处超过了维护两个版本IMO的成本.
注:C89标准中增加了void *
型;早期版本的C有malloc()
返回char *
,因此在这些版本中,如果要将结果分配给不同的指针类型,则需要强制转换was.不过,几乎所有人都至少支持C89标准,因此,您遇到这些较旧实现的可能性非常非常低.