2011-11-14 52 views
10

有這樣的代碼:陣列通過不恆定變量定義的大小的

#include <iostream> 

int main() 
{ 
    int size; 
    std::cin >> size; 

    size = size + 1; 
    int tab3[size]; 

    tab3[0] = 5; 
    std::cout << tab3[0] << " " << sizeof(tab3) << std::endl; 
    return 0; 
} 

結果是:

$ g++ prog.cpp -o prog -Wall -W 
$ ./prog 
5 
5 24 

爲什麼這個代碼甚至編譯?不應該是一個常量變量的數組長度?

我用g ++版本4.4.5。

回答

13

C++中的可變長度數組可以在GCC中作爲擴展使用,編譯時使用所有警告應該提醒您注意這一事實(包括-pedantic

+0

+1,我不知道'sizeof()'也可以是非常量。如果我曾經想過使用'sizeof()',我會期望它由於某種原因失敗。 –

+0

@ MichaelKrelin-hacker:再次,作爲一個擴展...... VLA需要一個運行時的'sizeof()',所以它是C99標準的一部分。這只是一個非常C++類型的東西。考慮'decltype'和所有這些... –

+0

雖然沒有出現任何*標準的在堆棧上分配內存的方法,這很有趣。我們可以使用placement-new來處理對象構造,但在C++中不可能在堆棧上獲取可變數量的原始內存。 –

7

這是一個C99功能,不是C++的一部分。它們通常refered爲沃拉斯(可變長度數組

如果運行g++-pedantic將被拒絕

更多信息,請參見GCC docs

參見:。VLAs are evil

2

GCC提供的VLA或可變長度陣列。更好的做法是創建一個指針並使用new關鍵字來分配空間。 VLA在MSVC中不可用,所以第二種選擇對於跨平臺代碼更好