2014-10-11 87 views
0

以下是合法的嗎?可變長度的靜態陣列

const int n=10; 
static int array[n]; 

如果是,那麼爲什麼以及如何?

+0

該數組的長度不是可變的。 'n'是常量表達式,其值在編譯時已知。 – 2014-10-11 05:35:24

+0

使用static或extern存儲類speci fi er聲明的數組對象不能有可變長度數組(VLA)類型。看到問題爲什麼不能使靜態數組的大小變化? [複製] – 2014-10-11 05:36:30

+0

@R Sahu:這是不正確的。在C語言中'const'對象不符合編譯時常量。這是C和C++語言之間的一個重要區別。 – AnT 2014-10-11 06:13:59

回答

3

請注意,在C語言中const對象不符合常量。它們不能用於構建常量表達式。在您的代碼示例中,n不是C語言術語中的常量。表達n不是C.

(參見"static const" vs "#define" vs "enum"Why doesn't this C program compile? What is wrong with this?對於更多的細節。)在整數表達式

這立即意味着你的array聲明是聲明一個可變長度數組的一種嘗試。變長數組只允許作爲自動(本地)對象。一旦用靜態存儲持續時間聲明數組,大小必須是一個整型常量表達式,即編譯時常量。您的n不符合此類要求。該聲明不合法。

這就是爲什麼在C語言中我們主要使用#define和/或enum來引入命名常量,而不是const對象。

0

靜態變量必須在COMPILE時間內分配,因此它們的大小和初始化值必須在編譯時已知。有人可能會爭辯說,使用編譯時優化n var可能會被常量值10替換,因此可能可以成功編譯該特定情況。

2
const int n=10; 
static int array[n]; 

此代碼會遇到一個錯誤:

 
storage size of ‘array’ isn’t constant static int array[n]; 
             ^

靜態存儲器分配是指執行相關的程序之前在編譯時保留存儲器的過程中,不象動態存儲器分配的或自動的存儲器分配在運行時根據需要分配內存。

const in C donot make the variable available in compile-time。

這樣的聲明不會產生錯誤:

static int array[10]; 

所以,你已經寫好的聲明是非法的,或者遇到錯誤,而在程序編譯。