为什么C++;需要malloc()的强制转换,但C不';T 我一直对此感到好奇——为什么C++中我必须从代码> MaloC/中返回返回值,而不是在C?< /P>中。 这里是C++的例子: int *int_ptr = (int *)malloc(sizeof(int*)); 这里是C++中不工作的例子(没有强制转换):

为什么C++;需要malloc()的强制转换,但C不';T 我一直对此感到好奇——为什么C++中我必须从代码> MaloC/中返回返回值,而不是在C?< /P>中。 这里是C++的例子: int *int_ptr = (int *)malloc(sizeof(int*)); 这里是C++中不工作的例子(没有强制转换):,c++,c,malloc,C++,C,Malloc,我听说在C语言中,实际上,从malloc()强制转换输出是一个错误 有人能对此主题发表评论吗?C支持从void*隐式转换到其他指针类型。C++不允许它。< /P> 在C中不赞成显式强制转换malloc的返回值的一个原因是,如果malloc签名未包含在当前编译单元中,编译器将假定返回类型为int,并将其隐式转换为要分配给的指针类型,从而生成编译时警告,您将立即解决该问题。用显式强制转换,如果你犯了这个错误,就不会发出警告。 < P>这是因为C++是强类型语言。在C++中,只有在“加宽”时才允许隐式

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


有人能对此主题发表评论吗?

C支持从
void*
隐式转换到其他指针类型。C++不允许它。< /P>
在C中不赞成显式强制转换
malloc
的返回值的一个原因是,如果
malloc
签名未包含在当前编译单元中,编译器将假定返回类型为
int
,并将其隐式转换为要分配给的指针类型,从而生成编译时警告,您将立即解决该问题。用显式强制转换,如果你犯了这个错误,就不会发出警告。

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

malloc()。通过使用显式强制转换,您告诉编译器您所做的实际上是有意的

C、 奥托,没有这样严格的铸造规则;您可以愉快地在任意两种类型之间进行转换,作为程序员,您有责任确保不会因此发生不好的事情。

以下几点:

C允许将void指针隐式转换为任何其他对象指针类型。C++没有。 如果您忘记包含stdlib.h或在范围中没有对
malloc()
的声明,则在C中强制转换
malloc()的结果将取消一个有用的诊断。请记住,如果C看到一个没有事先声明的函数调用,它将假定该函数返回
int
。如果您没有
malloc()
的声明,并且不执行强制转换,您将得到一个诊断,表明您正在尝试分配不兼容的类型(int到指针)。如果强制转换结果,则会禁用诊断,并且可能会出现运行时问题,因为不能保证将指针值转换为int并再次转换为指针会得到有用的结果

如果您正在编写C++,则应该使用<代码>新< /COD>和<代码>删除<代码>,而不是<代码> MalCube()/<代码>和<代码> For()/<代码>。是的,是的,是的,我已经听说了人们为什么要把代码编译成C和C++的所有原因,但是使用正确的内存管理工具的好处超过了维护IMO < /P>两个版本的成本。


注:C89标准中增加了
void*
类型;早期版本的C具有
malloc()
return
char*
,因此在这些版本中,如果要将结果分配给不同的指针类型,则需要强制转换。但是,几乎每个人都至少支持C89标准,因此您遇到这些较旧实现的可能性非常非常低

< P> C具有非常宽松的规则,C++有更严格的规则。这种情况下的区别在于C允许在对象指针和
void
指针之间进行隐式转换/赋值。C++没有。

事实上,旧式C甚至鼓励隐式转换到
void
指针,作为旧式泛型C编程的一部分。C++不需要使用<代码> VoUT/COD>指针,因为它具有函数重载和模板等。使用<代码> VoUT>代码> C++中的指针经常是可疑的。

关于跳过死马关于“代码< Mulalc < /CUT>的结果的争论>引起的错误,在代码< > STDLIB .H/COD>不包括,这样做从来没有有效的C++,而且在过去的21年中也没有有效的C。 最佳做法:

C

  • 如果您是使用
    -std=c89
    -ansi
    -dionor
    等进行编译,则不要强制转换
  • 否则,请遵循您的编码标准。
    • 如果它允许在
      void
      和对象指针之间进行隐式转换,则不要强制转换
    • 如果不允许,则执行cast(这可能意味着您正在使用静态代码分析)
    • 如果您没有编码标准,那么这真的没有多大关系。演员阵容是无害的,但增加了混乱
C++

  • 总是投
  • 避免
    void
    指针
  • 最重要的是,避免使用
    malloc
    ,而是使用
    new
    /
    new[]

C++对类型更敏感,需要您通过强制转换指定确切的类型。这与您的问题没有直接关系,但我认为您需要的是
sizeof(int)
,而不是
sizeof(int*)
。也就是说,使用<代码> sieOfs*ItPPTR>代码>,这将确保您将分配正确的内存量,无论是什么类型的代码> ItnPtR都指向。为什么在C++中使用Maloc?在C中,CAST没有错,但完全不必要。在C++中,使用<代码> Value*/Cux>或<代码> MalCube()/<代码>(除了使用C设计的接口)几乎肯定是错误的。去学习D或go之类的东西现代编译器不会因为malloc()的声明丢失而输出警告吗?不管是否存在强制转换问题?@Daniel:这也取决于
int *int_ptr = malloc(sizeof(int*));