C++ 类型为“的值”;无效*”;无法分配给类型为“的实体”;随机结构*”;

C++ 类型为“的值”;无效*”;无法分配给类型为“的实体”;随机结构*”;,c++,c,C++,C,所以我在虚空中研究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 (Ac

所以我在虚空中研究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;
}

int iInitRandomPhaseArrays(WS_元素*Aufbau,RANDOMSTRUCT**random)
{
WS_元素*Act;
int i计数器=0,i;
随机结构*虚拟;
Act=Aufbau;
如果(*随机!=NULL)
返回-1;
while(Act!=NULL)
{
如果(动作->操作==Linsenarray)
iCounter++;
Act=Act->pNext;
}
如果(i计数器)
{
虚拟=malloc(i计数器*sizeof(随机));
ran1_3ARG(ran1_idum和ran1_iy,ran1_iv);
虚拟[0]。idum=ran1_idum;
虚拟[0]。iy=ran1_iy;
memcpy(虚拟[0].iv,ran1_-iv,sizeof(ran1_-iv));
对于(i=0;i
此处显示错误:

“void*”类型的值不能分配给“RANDOMSTRUCT*类型的实体

有人能帮我解决吗?

更改线路:

dummy = malloc(iCounter * sizeof(random));
说:

dummy = (RANDOMSTRUCT *)malloc(iCounter * sizeof(RANDOMSTRUCT));
更改行:

dummy = malloc(iCounter * sizeof(random));
说:

dummy = (RANDOMSTRUCT *)malloc(iCounter * sizeof(RANDOMSTRUCT));
这会分配错误的内存量(指针大小的倍数,而不是指向的值),并返回一个
void*
。在
void*
中,不会隐式转换为其他指针类型。在它里面

假设你实际上打算在C++代码中使用C-ISM,请写下:

template<class T>
T* typed_malloc( std::size_t count = 1 ) {
  return static_cast<T*>(malloc( sizeof(T)*count ));
}
有时在中使用
malloc
并不容易删除,因为您的代码与代码交互。这种更改可以在错误发生之前消除它们,因为您可以相对透明地修改代码

这会分配错误的内存量(指针大小的倍数,而不是指向的值),并返回一个
void*
。在
void*
中,不会隐式转换为其他指针类型。在它里面

假设你实际上打算在C++代码中使用C-ISM,请写下:

template<class T>
T* typed_malloc( std::size_t count = 1 ) {
  return static_cast<T*>(malloc( sizeof(T)*count ));
}

有时在中使用
malloc
并不容易删除,因为您的代码与代码交互。这种更改可以在代码修改为相对透明的情况下消除错误。

看起来,您可能试图编译C代码,就像它是C++代码一样。C语言允许自动转换<代码> VUL> */COD>到任何其他类型的数据指针(例如,从<代码> MalCube()获得/<代码>),但是C++需要一个显式的转换。我认为它应该是代码> siZeof(**RAPION)<代码> @ PUNYCODE或只是<代码>哑= Malc(IcOnter *sieZof(*Dimy));代码>,所以你不必找出正确的类型。看起来你可能试图编译C代码,就像它是C++代码一样。C语言允许自动转换<代码> VUL> */CUT>到任何其他类型的数据指针(比如你从<代码> MalCube()/代码>中获得的,但是C++需要一个显式的转换。我认为它应该是<代码> siZeof。(**随机)<代码> @ PyyCal码或只是<代码>哑= Malc(IcOnter *sieZof(*Dimy));< /COD>,因此您不必确定正确的类型。如果语言应该是C,则不必要。如果语言应该是C++,那么可能“代码> MalOC 应该是代码>新< /Calp>或<代码> STD::vector < /Cord>。(虽然我不知道什么是
RANDOMSTRUCT
是肯定的,但这行数据的大小是错误的(指针的大小取决于它的外观,而不是随机结构)这是很好的-甚至在C中,指定MalCal/ReloLoad指针的返回类型。这不是必须的,但是它对代码可重构性和清晰度有好处。如果语言应该是C,这是不必要的。如果语言应该是C++,那么可能是“代码> MalOC 应该是代码>新< /Calp>或<代码> STD::vector 取而代之。(虽然我不知道什么是
RANDOMSTRUCT
是肯定的,但行的数据大小是错误的(指针的大小取决于它的外观,而不是随机结构),即使是在C语言中,指定malloc'd/realloc'd指针的返回类型也很好。这不是必需的,但有利于代码的可读性和清晰性。