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

Why does C++ require a cast for malloc() but C doesn't?

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

下面是C++中的例子:

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

这里是C++中不起作用的例子(没有强制转换):

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

我听说在C语言中,实际上,从malloc()转换输出是一个错误。

有人能就这个话题发表评论吗?


几点:

C允许将空指针隐式转换为任何其他对象指针类型。C++没有。

如果您忘记在C中包含stdlib.h或在范围内没有对malloc()的声明,那么将malloc()的结果强制转换为C将支持有用的诊断。记住,如果C看到一个没有事先声明的函数调用,它将假定函数返回int。如果您没有为malloc()声明,并且不使用强制转换,那么您将得到一个诊断结果,即您试图分配不兼容的类型(int到pointer)。如果强制转换结果,则会抑制诊断,并可能出现运行时问题,因为不能保证将指针值转换为int并再次转换回指针会给出有用的结果。

如果你正在编写C++,你应该使用EDCOX1,11,EDCOX1,12,而不是EDCOX1,5,EDCX1,14。是的,是的,是的,我已经听说了人们想要把代码编译成C和C++的所有原因,但是使用正确的内存管理工具的好处超过了维护两个版本IMO的成本。

注:c89标准中增加了void *类型;c的早期版本中malloc()返回char *,因此在这些版本中,如果将结果分配给不同的指针类型,则需要强制转换。不过,几乎每个人都支持至少C89标准,因此您遇到这些旧实现之一的几率非常非常低。


这是因为C++是一种强类型语言。在C++中,只有在"加宽"时才允许隐式转换,也就是说,如果新类型可以保存旧类型所能保存的每一个值。允许从较小的整数类型转换为较大的整数类型;允许从任何指针类型转换为void*;允许从子类转换为其超类。所有其他类型的转换都必须显式地进行,从而告诉编译器"我知道我在做什么,这不是一个错误"。

malloc()返回void*,它可以是任何东西,因此编译器不能保证您的强制转换成功(或有意义)。通过使用显式类型转换,您可以告诉编译器您所做的实际上是有意的。

c,otah,没有这么严格的强制转换规则;您可以在任意两种类型之间愉快地强制转换,并且作为程序员,您有责任确保不会因此发生坏事情。


C支持从void*到其他指针类型的隐式强制转换。C++不允许它。

C中不赞成显式转换malloc的返回值的一个原因是,如果当前编译单元中不包括malloc签名,编译器将假定返回类型为int并隐式转换为要分配给结果的指针类型,这将导致编译时警告yo。你会立刻解决的。有了一个明确的演员表,如果你犯了这个错误,将不会发出任何警告。