可變長度數組是一個C99的功能,但允許作爲在GCC的擴展的C++。在C99中,它是非法的初始化可變長度數組:
6.7.8/3的類型的實體被初始化應未知大小或不是可變長度數組的對象類型的數組 類型。
無論是非法的初始化VLA在GCC沒有在manual指出,這樣你就可以假定它是未定義的行爲。但是,你也有另一個未定義行爲的來源:f()
沒有return語句,因此你的程序中可能會發生任何事情(分段錯誤和異常是我在GCC 4.9.0中得到的兩個不同結果)
它編譯的原因在GCC 4.9.0中成功只是開發人員可以回答的問題。提交錯誤報告。
猜測:「運行時大小的數組」是proposed被添加到C++ 14,但沒有削減。 GCC在4.9中執行原始提案。我前面提到的例外是在該提案的特徵:
類bad_array_length
namespace std {
class bad_array_length : public bad_alloc {
public:
bad_array_length() noexcept;
};
}
類bad_array_length
定義:
之前18.6.2.2 new.badlength新增加一節作爲 異常拋出的對象的類型通過實現報告嘗試分配 運行時綁定的數組,其大小小於或等於零o r 大於實現定義的限制(8.3.4 dcl.array)。
bad_array_length() noexcept;
影響:構建bad_array_length
類的對象。 備註:在新構建的對象上調用what()
的結果是實現定義的。
該文檔指出,在GCC 5及更高版本中,現在支持just regular VLAs。如果是這樣的話,代碼應該被拒絕。
這是C還是C++?VLA只是其中之一的標準。無論如何GCC都支持它們。 – chris
這是一個可變長度數組,vla,它的語言很重要,請選擇一個 –
@chris:它是C++。 –