使用malloc c ++时出现C2440错误

时间:2017-02-24 10:40:06

标签: c++

我在视觉工作室尝试了“KEYVIEW1.C - Charles Petzold,1998”的代码,但我在这部分代码中遇到了错误:

pmsg =(void*) malloc(cLinesMax * sizeof (MSG));

错误是:

  

错误1错误C2440:'=':无法从'void *'转换为   'PMSG'd:\ win32   projects \ win32project8 \ win32project8 \ win32project8.cpp 97 1 Win32Project8

任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

错误是由(void *)malloc(..)引起的。
malloc()不知道您的变量类型(MSG *),因此返回无类型指针(void *)。
现在,您要将MSG *设置为void *,这就是错误发生的位置 MSG *void *显然不是同一类型。

请勿在c ++中使用malloc() Why?Why?

代码示例:
如果您仍想使用malloc(),请按以下步骤操作:

MSG *pmsg = (MSG *)malloc( cLinesMax * sizeof(MSG) ); // Allocate Memory
... pmsg[0].member = "blub";    // Do stuff with pmsg
free( pmsg );                   // Delete dynamic allocated memory

如果你想使用c ++方式,请按以下方式进行:

MSG *pmsg = new MSG[cLinesMax]; // Allocate an Array of MSG's with size $cLinesMax
... pmsg[0].member = "blub";    // Do stuff with pmsg
delete pmsg;                    // Delete dynamic allocated memory 

我认为c ++方式更具可读性,newdeletemallocfree更安全。

澄清示例:http://ideone.com/46twoD

事实上:使用newdelete减少错误!

  1. malloc()返回void *
     必须自己将其投放到MSG *  new为你投了
  2. malloc()将字节数作为参数,这意味着
     必须自己计算字数 num * sizeof(MSG))。
     可能会错误计算字节数(例如sizeof(MSG)sizeof(MSG *))  new自动为您计算字节数

答案 1 :(得分:1)

<强>建议
不要在C ++程序中使用malloc(),而是使用new或更好的RAII技术。

如果由于某种原因你仍然被迫使用malloc(),你必须将malloc()返回的void *转换为接收变量指针类型,在你的情况下可能:

pmsg = (MSG*)malloc(cLinesMax * sizeof(MSG));

答案 2 :(得分:1)

要删除错误,请使用C编译器;或者如果你想坚持使用C ++编译器,那么你需要显式地输入强制转换malloc的返回值。

此处解决了类似的问题:Cannot convert from 'void *' to 'node *'