我在视觉工作室尝试了“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
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:2)
错误是由(void *)malloc(..)
引起的。
malloc()
不知道您的变量类型(MSG *
),因此返回无类型指针(void *
)。
现在,您要将MSG *
设置为void *
,这就是错误发生的位置
MSG *
和void *
显然不是同一类型。
代码示例:
如果您仍想使用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 ++方式更具可读性,new
和delete
比malloc
和free
更安全。
事实上:你使用new
和delete
减少错误!
malloc()
返回void *
MSG *
new
为你投了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 *'