簡體   English   中英

如何在C函數內部定義數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM