當我試圖此代碼它的工作原理:數組常量大小(全球VS堆棧)
const int i = 5;
int main() {
int arry[i];
}
儘管這並不工作:
const int i = 5;
int arry[i];
int main() {
}
我看過這裏所有的帖子有關數組與恆定的大小,但我不明白爲什麼當聲明arry
在主要它的作品。
當我試圖此代碼它的工作原理:數組常量大小(全球VS堆棧)
const int i = 5;
int main() {
int arry[i];
}
儘管這並不工作:
const int i = 5;
int arry[i];
int main() {
}
我看過這裏所有的帖子有關數組與恆定的大小,但我不明白爲什麼當聲明arry
在主要它的作品。
2版是根本不成立C,因爲i
是一個只讀變量,而不是一個真正的編譯時間常數。如果您想使其工作,您可以使用malloc
和free
(或大小爲#define
)。
版本1使用可變長度數組,這是C99的標準功能。gcc
在C99之前的代碼中支持該語法作爲擴展。如果您將代碼編譯爲C90並打開-pedantic
,則會發出警告ISO C90 forbids variable length array ‘arry’
。
您可以詳細闡述爲什麼版本1無效C. –
的這裏的問題是,在const
C沒有導致真正的常數。
當你寫const int i = 5
你有什麼是一個只讀變量,而不是一個常量。在C99中,尺寸爲i
的數組是一個可變長度數組(VLA)。 VLA僅適用於堆棧分配的變量,因此會出現編譯錯誤。
如果您需要具有全局範圍的數組,你應該切換到宏。
#define ARRAY_SIZE 5
int arry[ARRAY_SIZE];
這是有效的,因爲5
是文字這是一個真正的常數。
事實上,即使用於自動存儲的陣列(即,堆棧分配的本地變量)應該避免一個VLA因爲它們招致運行時開銷。
定義「沒有工作」。你是否遇到編譯器錯誤,崩潰,核外崩潰,被外星人劫持?你期望會發生什麼,實際發生了什麼,以及你給出的信息有哪些不同? – ssube
你看到什麼錯誤或警告? – cpx
錯誤:在文件範圍內各種變型「數組」這 錯誤出現 –