2010-05-19 95 views
26

我一直認爲在C++中聲明數組時,大小必須是一個常量整數值。用非常量變量聲明數組大小

例如:

int MyArray[5]; // correct 

const int ARRAY_SIZE = 6; 
int MyArray[ARRAY_SIZE]; // correct 

int ArraySize = 5; 
int MyArray[ArraySize]; // incorrect 

這裏還什麼是The C++ Programming Language, by Bjarne Stroustrup解釋說:

數組的元素個數(數組綁定)必須是常量表達式(§C.5)。 如果你需要變量邊界,使用一個矢量(§3.7.1,§16.3)。例如:

void f(int i) { 
    int v1[i];   // error : array size not a constant expression 
    vector<int> v2(i); // ok 
} 

但我很大的驚喜,上面的代碼不會編譯我的系統上的罰款!

這裏是我試圖編譯:

void f(int i) { 
    int v2[i]; 
} 

int main() 
{ 
    int i = 3; 
    int v1[i]; 
    f(5); 
} 

我沒有錯誤! 我正在使用GCC v4.4.0。

有什麼我失蹤了嗎?

+17

這就是爲什麼用編譯器測試東西並不代表任何代碼正確性的原因。 – GManNickG 2010-05-19 06:37:34

+1

重複的 http://stackoverflow.com/questions/737240/c-c-array-size-at-run-time-w-o-dynamic-allocation-is-allowed – nico 2010-05-19 06:40:22

回答

24

這是標準的GCC擴展:see here

當您使用其中一個擴展名(以便考慮到可移植性)時,可以使用-pedantic選項來使GCC發出警告或-std=c++98發生錯誤。

6

您正在使用C99中稱爲VLA(可變長度陣列)的功能。如果你這樣編譯你的程序會更好:

g++ -Wall -std=c++98 myprog.cpp