2017-12-25 17 views
2

それはC++で静的配列は、constの式からのみ初期化できることを忘れているようだが、あなたが書いた場合:C++静的配列は

#include <iostream> 

int main() { 
    int n; 
    std::cin >> n; 
    int a[n]; 
    std::cout << sizeof(a); 

    return 0; 
} 

このプログラムが正常にコンパイル(gccのC++ 17)とn * sizeof(int)を出力します。 しかし、なぜこれはそうですか?

+1

'std :: vector'を使わないのはなぜですか? –

+1

GCC(残念なことに)はデフォルトで拡張としてVLAを許可します。 '-std = C++ 17'や' -Wvla -Werror'でコンパイルすれば、それはできません。 –

+0

しかし、VLAはどのように機能しますか?スタックの予約はありますか? – Mano

答えて

5

Variable-length arraysは標準の一部ではありません。これらは、GCCの場合であるコンパイラ拡張として存在することができます。

警告:ISO C++が配列に適用する場合、可変長配列は、「」[-Wvla]

sizeofオペレータはのサイズを返し禁止コンパイルするときには、警告を受ける可能性があります基礎となる型のサイズである配列全体が要素の数を掛けます。基準状態、強調鉱山:

同じコードを介して別のパスを、その寿命の間が、 を変更しない各VLAインスタンスのサイズは、それ 異なるサイズで割り当てられることができます

6.19 Arrays of Variable Length状態と題する公式GCCのドキュメント:

をこれらの配列は、他の自動配列のように宣言が、定数式ではありません 長さとされています。記憶域は で宣言のポイントに割り当てられ、宣言を含むブロックスコープ が終了すると割り当てが解除されます。

生(Cスタイル)配列に対してstd::vectorまたはstd::arrayを好むと言われています。