2016-02-11 2 views
0

Почему этот код компиляции успешно, без каких-либо предупреждений:переменной длины два двумерный массив C++

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

[скомпилированные с MinGW с Code :: Blocks]

Не следует ли по крайней мере один из м или п должен быть постоянным во время компиляции ?? Я видел массивы переменной длины, но все они были одномерными. Почему этот двухмерный прием также принимается ??

Кроме того, это также работает совершенно нормально:

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

В коде :: Blocks Setting-> Compiler ...-> Compiler Setting-> Марк Включить предупреждение требует строгого ISO C и ISO C++ (-pedantic), то вы должны получить два предупреждения. – ashiquzzaman33

ответ

-1

Синтаксис вашего кода является правильным на C++ consepts. Но если вы введете m или n меньше нуля или m * n более чем около 10000, это будет завершение. Вот почему вы пишете свой код в try-catch, как показано ниже:

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

стандарт C++ не поддерживает переменную длину массива. – ashiquzzaman33

0

Размеры массива должны быть определены только при инициализации. Давайте предположим, что пользователь вводит m = 4 и n = 2:

int arr[m][n]; 

... становится ...

int arr[4][2]; 

Вуаля, компилятор имеет всю информацию, необходимую для инициализации массива.

Я думаю, что это то, что вы думаете:

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 
+0

AFAIK, стандартный C++ не поддерживает переменную длину массива. – ashiquzzaman33

+0

Я просто попробовал. Ты прав. – thequantumforge

1

Это нестандартное расширение GCC. Многие другие компиляторы, такие как Visual C++, не поддерживают VLA.

LIVE DEMO

Смежные вопросы