此代码
#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()尝试过,也没用!)
答案 0 :(得分:2)
你绝对不想要alloca()
。这是一个在函数堆栈上的分配,只持续调用的持续时间。它允许你拥有在函数返回时消失的动态数组(在C ++中你可以用RAII来做,但在C alloca
中是唯一的方法。)
您只需要在分配中进行投射。试试i = (unsigned int *)malloc(StringLength() * sizeof(*i))
。请注意sizeof(*i)
。这是一个成员的大小:sizeof(i)
是指针的大小,不太可能与内部的内容有关。
答案 1 :(得分:1)
Malloc和alloca返回void *指针。只需改变
i = alloca(StringLength() * sizeof(i));
到
i = (unsigned int *)alloca(StringLength() * sizeof(i));
答案 2 :(得分:1)
我不确定alloca,但malloc return的void *和C ++不同于C不支持从void *到任何其他指针类型的隐式转换。这是C ++与C语言不同的众多领域之一。
答案 3 :(得分:1)
从alloca转换返回指针:
i = (unsigned int *) alloca(StringLength() * sizeof(i));
答案 4 :(得分:1)
在C ++中,void指针不可以隐式转换为其他指针,与C不同。因此你需要一个强制转换:
i = static_cast<unsigned int *>(alloca(StringLength() * sizeof(i)));