【问题标题】:Invalid conversion while allocating memory with alloca使用 alloca 分配内存时转换无效
【发布时间】:2011-12-11 20:00:26
【问题描述】:

这段代码

#include "alloca.h"

String str = "abc";

unsigned int *i;

void setup() {  
  Serial.begin(9600);

  i = alloca(StringLength() * sizeof(i));

  unsigned int j[StringLength() * sizeof(i)];
}

int StringLength() {
  return str.length();
}

void loop() {
}

给我以下错误信息:

sketch_dec11f.cpp:在函数“void setup()”中: sketch_dec11f.cpp:14:7:错误:从“void*”到“unsigned int*”的无效转换

我做错了什么?

(用 malloc() 也试过了,也没用!)

【问题讨论】:

  • 所以您实际上使用的是 C++,而不是 C?
  • 事实上它是 arduino...但是是的,你是对的

标签: c++ arduino


【解决方案1】:

你绝对不想要alloca()。这是在函数堆栈上的分配,仅在调用期间持续。它让您拥有在函数返回时消失的动态数组(在 C++ 中,您可以使用 RAII 执行此操作,但在 C 中,alloca 是唯一的方法)。

您只需要在分配中进行转换。试试i = (unsigned int *)malloc(StringLength() * sizeof(*i))。注意sizeof(*i)。这是一个成员的大小:sizeof(i) 是指针的大小,不太可能与里面的内容有关。

【讨论】:

  • 更好的是,如果你正在编写 C++,请不要使用 malloc
【解决方案2】:

Malloc 和 alloca 返回 void * 指针。换个方式

i = alloca(StringLength() * sizeof(i));

i = (unsigned int *)alloca(StringLength() * sizeof(i));

【讨论】:

    【解决方案3】:

    我不确定 alloca,但 malloc 返回的 void * 和 C++ 与 C 不同,不支持从 void * 到任何其他指针类型的隐式转换。这是 C++ 与 C 不同的众多领域之一。

    【讨论】:

      【解决方案4】:

      从alloca中转换返回指针:

      i = (unsigned int *) alloca(StringLength() * sizeof(i));
      

      【讨论】:

        【解决方案5】:

        在 C++ 中,void 指针 不能 隐式转换为其他指针,这与 C 不同。因此您需要强制转换:

        i = static_cast<unsigned int *>(alloca(StringLength() * sizeof(i)));
        

        【讨论】:

          猜你喜欢
          • 2011-12-20
          • 2010-09-21
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 2014-04-15
          • 2013-04-22
          • 2019-07-09
          • 1970-01-01
          相关资源
          最近更新 更多