[英]How to define an array inside a function in C?
因此,在我的源文件中,我具有folowin函數:
void update(state* old_state, state* measurement, uint32_t size)
{
state new_state[size];
//some function using measurement and old_state and returning the result in newstate
arm_fadd_32(measurement,old_state,newstate,size);
//代碼的其余部分}
現在,編譯器將引發錯誤,指出error#28:expression必須具有恆定值。 我認為這是由於這樣的事實,即使在方法內部,大小局部變量沒有改變,編譯器在定義大小時也期望常量。 我嘗試了以下方法:
int const a = size;
然后嘗試重新初始化,表示常量值未知。 我在Internet上進行了一些研究,似乎不使用malloc沒有比這更簡單的方法了,因為我將代碼用於某些嵌入式應用程序,所以我不希望這樣做。
有沒有一種方法可以避免這個問題而無需真正使用malloc? 在此先感謝大家!
不,不是。 如果編譯器不允許使用可變長度數組,則意味着它需要一個編譯時常量 。
C99支持VLA,這可能不是您所使用的。
int const a
聲明一個常量變量(haha!),但絕不是編譯時常量。 您需要使用malloc
。
從1990 ISO C標准開始,數組的大小必須為常數整數表達式。 注意“ constant”,而不是const
。 常量表達式(大約)是在編譯時就知道值的表達式。 const
盡管來自同一個詞根,但實際上僅表示“只讀”。
1999年標准添加了VLA(可變長度數組),這將使您的代碼合法。 VLA的一個缺點是沒有機制來檢測分配所需空間的失敗。 如果分配失敗,則您的程序行為未定義。 ( 如果幸運的話,它可能會崩潰。)
如今,大多數C編譯器確實支持大多數C99標准。 您可能需要命令行選項才能啟用它。 另一方面,Microsoft的C編譯器僅支持C90,以及極少數的C99特定功能,並且Microsoft表示他們沒有計划對此進行更改。 如果您讓我們知道您使用的是什么編譯器,我們可能會更有幫助。
您可以使用malloc()
在堆上分配動態大小的數組:
state *new_state = malloc(size * sizeof *new_state);
if (new_state == NULL) {
// allocation failed, handle the error somehow
}
請注意, malloc()
返回一個空指針以指示分配失敗,即使您的編譯器支持VLA,這也是VLA的優勢。
您的C編譯器顯然不支持C99 VLA。 這意味着數組在編譯時必須具有已知的維數。 而你沒有。
顯然,您可以使用malloc
在堆上進行分配。 但是您已經說過,出於性能原因,您不想這樣做。 如果確實必須有堆棧分配的內存(其大小是在運行時確定的),則需要使用alloca
。
當心alloca
充滿危險。 與使用C99 VLA時一樣,使用alloca
,堆棧溢出是永遠存在的危險。
在C89中,數組大小必須恆定。 const
限定符不會將對象限定為常數 ,而是變為只讀。
在C99中,您可以使用非恆定的數組大小,這些數組稱為可變長度數組(VLA)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.