Неверное преобразование при выделении памяти с помощью alloca - PullRequest
1 голос
/ 12 декабря 2011

Этот код

#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 ]

2 голосов
/ 12 декабря 2011

Вы определенно не хотите alloca().Это распределение, которое находится в стеке функции и длится только в течение вызова.Он позволяет вам иметь динамические массивы, которые исчезают при возврате функции (в C ++ вы могли бы сделать это с RAII, но в C alloca это был единственный выход).

Вам просто нужен приведение в вашем распределении.Попробуйте i = (unsigned int *)malloc(StringLength() * sizeof(*i)).Обратите внимание на sizeof(*i).Это размер одного элемента: sizeof(i) - это размер указателя, который вряд ли будет связан с тем, что внутри.

1 голос
/ 12 декабря 2011

В C ++ указатели void не неявно преобразуются в другие указатели, в отличие от C. Поэтому вам необходим приведение:

i = static_cast<unsigned int *>(alloca(StringLength() * sizeof(i)));
1 голос
/ 12 декабря 2011

Приведите возвращаемый указатель из alloca:

i = (unsigned int *) alloca(StringLength() * sizeof(i));
1 голос
/ 12 декабря 2011

Я не уверен в alloca, но malloc возвращает void * и C ++, в отличие от C, не поддерживает неявное преобразование из void * в любой другой тип указателя.Это одна из многих областей, где C ++ отличается от C.

1 голос
/ 12 декабря 2011

Malloc и alloca возвращают указатели void *. Просто поменяй

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

до

i = (unsigned int *)alloca(StringLength() * sizeof(i));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...