使用alloca分配内存时转换无效

时间:2011-12-11 20:00:26

标签: c++ arduino

此代码

#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()尝试过,也没用!)

5 个答案:

答案 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)));