2011-12-11 32 views
1

此代碼無效的轉換與ALLOCA

#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: In function ‘void setup()’: sketch_dec11f.cpp:14:7: error: invalid conversion from ‘void*’ to ‘unsigned int*’

我在做什麼錯?

+0

所以你實際上使用C++,而不是C? – sth

+0

其實它是arduino ...但是,是的,你是對的 – speendo

回答

2

你肯定不希望alloca()。這是一個在函數堆棧中的分配,並且只在調用期間持續。它可以讓動態數組在函數返回時消失(在C++中,您可以使用RAII執行此操作,但在C alloca中是唯一的方法)。

您只需在您的分配中進行強制轉換。嘗試i = (unsigned int *)malloc(StringLength() * sizeof(*i))。請注意0​​。這是一個成員的大小:sizeof(i)是指針的大小,不可能與內部相關。

+2

更好的是,如果你正在編寫C++,不要使用'malloc'。 –

1

malloc和ALLOCA返回void *指針(使用malloc()爲好,也沒有工作!試過)。只要改變

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

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

我不確定alloca,但malloc返回的void *和C++不像C不支持從void *到任何其他指針類型的隱式轉換。這是C++從C.

不同
1

從ALLOCA投射返回指針的許多領域之一:

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

在C++中,空隙指針隱式轉換爲其它指針,與C.因此你需要一個演員:

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