变长二维数组c ++

时间:2016-02-11 04:33:59

标签: c++ arrays mingw variable-length-array

为什么这段代码成功编译,没有任何警告:

int m,n;
cin >> m >> n;
int arr[m][n];

[使用Code :: Blocks编译MinGW]

至少m或n中的一个必须在编译时保持不变? 我已经看过可变长度数组,但它们都是一维的。为什么这个二维也被接受?

此外,这也完全正常:

int arr[m][n][p];

3 个答案:

答案 0 :(得分:1)

这是非标准的GCC扩展。许多其他编译器,如Visual C ++,不支持VLA

LIVE DEMO

答案 1 :(得分:0)

只需在初始化时定义数组维度。假设用户输入m = 4n = 2

int arr[m][n];

... ...变为

int arr[4][2];

Voilà,编译器具有初始化数组所需的所有信息。

我认为这就是你的想法:

int arr[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};    // this code will fail

编译器只会自动检测第一维的数组大小。

int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};   // this code will work

答案 2 :(得分:-1)

c ++语法的代码语法是正确的。但是如果你输入m或n小于零或m * n大于10000,那么它就会被提取。这就是你在try-catch中编写代码的原因,如下所示:

int m,n;
cin >> m >> n;
try {
    int arr[m][n];
} catch (Exception e){
    cout << "Error";
}