2011-10-30 37 views
4

當我試圖此代碼它的工作原理:數組常量大小(全球VS堆棧)

const int i = 5; 
int main() { 
    int arry[i]; 
} 

儘管這並不工作:

const int i = 5; 
int arry[i]; 
int main() { 

} 

我看過這裏所有的帖子有關數組與恆定的大小,但我不明白爲什麼當聲明arry在主要它的作品。

+3

定義「沒有工作」。你是否遇到編譯器錯誤,崩潰,核外崩潰,被外星人劫持?你期望會發生什麼,實際發生了什麼,以及你給出的信息有哪些不同? – ssube

+0

你看到什麼錯誤或警告? – cpx

+0

錯誤:在文件範圍內各種變型「數組」這 錯誤出現 –

回答

1

2版是根本不成立C,因爲i是一個只讀變量,而不是一個真正的編譯時間常數。如果您想使其工作,您可以使用mallocfree(或大小爲#define)。

版本1使用可變長度數組,這是C99的標準功能。gcc在C99之前的代碼中支持該語法作爲擴展。如果您將代碼編譯爲C90並打開-pedantic,則會發出警告ISO C90 forbids variable length array ‘arry’

+2

您可以詳細闡述爲什麼版本1無效C. –

9

的這裏的問題是,在const C沒有導致真正的常數。

當你寫const int i = 5你有什麼是一個只讀變量,而不是一個常量。在C99中,尺寸爲i的數組是一個可變長度數組(VLA)。 VLA僅適用於堆棧分配的變量,因此會出現編譯錯誤。

如果您需要具有全局範圍的數組,你應該切換到宏。

#define ARRAY_SIZE 5 
int arry[ARRAY_SIZE]; 

這是有效的,因爲5是文字這是一個真正的常數。

事實上,即使用於自動存儲的陣列(即,堆棧分配的本地變量)應該避免一個VLA因爲它們招致運行時開銷。

+0

您可以詳細說明由VLA引起的運行時間開銷。謝謝。 – NPE

+1

@aix對於VLA'int a [i]',編譯器必須編寫每次函數執行時讀取'i'值的代碼。對於一個固定長度的數組'int a [5]',編譯器知道爲'a'分配多少堆棧空間。 –

+1

當然。對我來說,這似乎有點令人驚訝,這種開銷會保證避免VLA的一攬子建議。 – NPE