【问题标题】:a value of type "void *" cannot be assigned to an entity of type "RANDOMSTRUCT *"“void *”类型的值不能分配给“RANDOMSTRUCT *”类型的实体
【发布时间】:2019-12-06 15:30:15
【问题描述】:

所以我在 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 *”类型的实体

谁能帮我解决?

【问题讨论】:

  • 看起来您可能正在尝试像编译 C++ 代码一样编译 C 代码。
  • C 语言允许将 void * 自动转换为任何其他类型的数据指针(例如从 malloc() 获得的数据指针),但 C++ 需要显式转换。
  • 我觉得应该是sizeof(**random)
  • @PunyCode 或者只是dummy = malloc(iCounter * sizeof(*dummy));,所以你不必找出正确的类型。

标签: c++ c


【解决方案1】:

换行:

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

说:

dummy = (RANDOMSTRUCT *)malloc(iCounter * sizeof(RANDOMSTRUCT));

【讨论】:

  • 如果语言应该是C,这是不必要的。如果语言应该是 C++,那么 malloc 应该是 newstd::vector。 (虽然我不知道RANDOMSTRUCT是什么)
  • 当然,但是该行无论如何都分配了错误的数据大小(指针的大小由它的外观而不是随机结构),而且它很好 - 即使在 C 中,也可以指定malloc'd / realloc'd 指针的返回类型。这不是必需的,但它有利于代码的可读性和清晰度。
【解决方案2】:
dummy = malloc(iCounter * sizeof(random));

这分配了错误的内存量(指针大小的倍数,而不是指向的)并返回void*。在 void* 不会隐式转换为其他指针类型。在 中确实如此。

假设您实际上是想在 C++ 代码中使用 C-isms,请编写以下代码:

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

此函数是 malloc 的类型安全版本,可处理 9999/10000 次使用,并防止出现烦人的错误。

然后将代码行改为:

dummy = typed_malloc<RANDOMSTRUCT>(iCounter);

有时在 中使用malloc 并不容易删除,因为您的代码与 代码交互。当您将 代码相对透明地修改为 时,这种更改可以在错误发生之前消除它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-23
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2019-03-27
    • 1970-01-01
    相关资源
    最近更新 更多