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

bod*_*ydo 39 c c++ malloc

我一直对此感到好奇 - 为什么在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++,那么您应该使用newdelete不是malloc()free().是啊,是啊,是啊,我听说过,为什么人们希望自己的代码编译为C和C++的所有原因,但使用该语言的正确的存储管理工具的好处大于维护两个版本IMO的成本.

注意:该void *类型是在C89标准中添加的; 早期版本的C有malloc()返回char *,因此在这些版本中,如果您将结果分配给不同的指针类型,需要强制转换.几乎每个人都至少支持C89标准的,所以你的赔率运行到那些旧的实现是非常非常低的一个.

  • 无论铸造问题如何,任何现代编译器都不会输出缺少malloc()声明的警告吗? (4认同)

tda*_*ers 13

那是因为C++是一种强类型语言.在C++中,只有在"扩展"时才允许隐式强制转换,也就是说,如果新类型可以包含旧类型可以容纳的每个值.允许从较小的整数类型转换为较大的整数类型; void*允许从任何指针类型转换; 允许从子类转换为其超类.所有其他演员必须明确制作,从而告诉编译器"我知道我在做什么,这不是一个错误".

malloc()返回一个void*,可能是任何东西,所以编译器不能保证你的演员会成功(或有意义).通过使用显式强制转换,您告诉编译器您正在做的事情实际上是有意的.

C,OTOH,没有这种严格的铸造规则; 你可以愉快地在任何两种类型之间进行投射,而你作为程序员负责确保不会发生任何不良事件.

  • 我可以隐式地将`int`转换为`bool`没有问题. (6认同)
  • *"那是因为C++是一种强类型语言."*......而C不是!? (2认同)
  • “*C++ 是一种强类型语言。*”嗯。“强类型”作为一个术语几乎毫无意义。作者通常用它来表示“我喜欢这种语言”。“*在 C++ 中,只有在“扩展”时才允许隐式强制转换,也就是说,如果新类型可以容纳旧类型可以容纳的每个值。*” 与此有关的几个问题:“强制转换”是显式类型转换; 如果它是隐式的,则它不是演员表。C++ 允许缩小类型转换,就像 C 一样:`int i = 1.3; float f = ULONG_MAX;` 编译没有错误。由于数组,将 `Derived*` 转换为 `Base*` 是不安全的。C++ 允许它,C 不允许。 (2认同)

Meh*_*ari 9

C支持从void*其他指针类型隐式转换.C++不允许它.

在C中明确强制转换返回值的一个原因malloc是,如果malloc签名未包含在当前编译单元中,编译器将假定返回类型是int隐式转换为指针类型你是在编译时警告中分配结果,您将立即解决.通过明确的演员表,如果你犯了这个错误,就不会发出任何警告.