所以我在void中处理malloc。我有一个代码:
int iInitRandomPhaseArrays(WS_ELEMENT *Aufbau, RANDOMSTRUCT **random)
{
WS_ELEMENT *Act;
int iCounter = 0, i;
RANDOMSTRUCT *dummy;
Act = Aufbau;
if (*random != NULL)
return -1;
while (Act != NULL)
{
if (Act->operation == Linsenarray)
iCounter++;
Act = Act->pNext;
}
if (iCounter)
{
dummy = malloc(iCounter * sizeof(random));
ran1_3ARG(&ran1_idum, &ran1_iy, ran1_iv);
dummy[0].idum = ran1_idum;
dummy[0].iy = ran1_iy;
memcpy(dummy[0].iv, ran1_iv, sizeof(ran1_iv));
for (i = 0; i < iCounter; i++)
ran1_3ARG(&dummy[i].idum, &dummy[i].iy, dummy[i].iv);
dummy[0].Anzahl = iCounter;
*random = dummy;
}
return iCounter;
}
此处错误:
不能将类型为“ void *”的值分配给类型为“ RANDOMSTRUCT *”的实体
有人可以帮我解决吗?
答案 0 :(得分:2)
更改行:
dummy = malloc(iCounter * sizeof(random));
说:
dummy = (RANDOMSTRUCT *)malloc(iCounter * sizeof(RANDOMSTRUCT));
答案 1 :(得分:0)
dummy = malloc(iCounter * sizeof(random));
这会分配错误的内存量(指针大小的倍数,而不是指向的大小),并返回void*
。在c++中,void*
不会隐式转换为其他指针类型。在c中确实如此。
假设您实际上是要在C ++代码中使用C-ism,请编写以下代码:
template<class T>
T* typed_malloc( std::size_t count = 1 ) {
return static_cast<T*>(malloc( sizeof(T)*count ));
}
此函数是malloc
的类型安全版本,可处理9999/10000次使用,并防止烦人的Bug。
然后将代码行更改为:
dummy = typed_malloc<RANDOMSTRUCT>(iCounter);
有时候在c++中使用malloc
并不容易删除,因为您的代码与c代码交互。当您将c代码相对透明地修改为c++时,这种更改可以消除错误,从而避免错误发生。