2012-10-02 108 views
1

所以在我的源文件我有folowin功能:如何在C函數中定義一個數組?

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

//其餘代碼 }

現在,編譯器會拋出一個錯誤,指出 錯誤#28:表達式必須具有恆定值。 我認爲這是由於這樣一個事實,即使在該方法內局部變量的大小沒有改變,編譯器在定義大小時也期待一個常量。 我曾嘗試以下:

int const a = size; 

,然後試圖重新初始化它說的恆定值是不知道。 我在互聯網上做了一些研究,似乎沒有使用malloc沒有簡單的方法,我不想因爲我使用某些嵌入式應用程序的代碼。

有沒有辦法避免這個問題,而不真正使用malloc?在此先感謝你們!

+0

你要麼知道編譯時的大小(可能在'#define'中),並使用該常數來分配數組,或者在編譯時不知道這個數字,你需要使用' malloc'。 – lvella

回答

4

截至1990年的ISO C標準,數組的大小必須是一個常數整數表達式。請注意「常量」,而不是const。常量表達式(大致)是其編譯時已知的值; const,雖然它來自同一個詞根,但其實只是意味着「只讀」。

1999年的標準增加了VLAs(可變長度數組),這會使你的代碼合法。 VLA的一個缺點是沒有檢測分配所需空間失敗的機制;如果分配失敗,你的程序行爲是不確定的。 (如果幸運的話,它可能會崩潰。)

這些天大多數C編譯器都支持大部分C99標準;你可能需要一個命令行選項來啓用它。另一方面,微軟的C編譯器僅支持C90,另外還支持極少數特定於C99的功能,而微軟表示他們沒有計劃改變這一點。如果你讓我們知道你使用的編譯器,我們可能會更有幫助。

您可以使用malloc()堆上分配一個動態大小的數組:

注意malloc()返回一個空指針來指示分配失敗,這是即使你的編譯器支持他們在沃拉斯的優勢。

+1

一些(因此它不是可移植的)實現也支持'alloca',它(具有更多的工作)提供了與VLA相同的功能......以及相同的缺點。 –

4

不,不是真的。如果編譯器不允許可變長度數組,則意味着它期望編譯時常量

在C99中支持VLA,這可能不是您正在使用的。

int const a聲明一個常量變量(哈哈!),但它絕不是編譯時常量。你需要使用malloc

1

在C89中數組的大小必須是恆定的。 const限定符不能將對象限定爲常量而只是爲了讀取。

在C99中,您可以擁有非常量數組大小,這些數組稱爲可變長度數組(VLA)。

2

你的C編譯器顯然不支持C99的VLA。這意味着數組在編譯時必須具有已知的維數。而你的不。

顯然你可以在堆上分配malloc。但是你已經聲明,出於性能原因你不想這麼做。如果您確實需要堆棧分配的內存,其大小是在運行時確定的,那麼您需要使用alloca

請注意alloca充滿危險。與使用C99 VLA時一樣,使用alloca時堆棧溢出是一種永久存在的危險。

相關問題