В конечном итоге причина в том, что вы не можете создавать статические массивы переменной длины.
В вашем коде вы пытаетесь создать статический массив динамических массивов, оба переменной длины.
Теперь статические массивы живут в стеке, а динамические массивы - в куче. В то время как управление памятью кучи «гибкое», стек отличается: компилятор должен иметь возможность определять размер каждого кадра в стеке. Это явно невозможно, если вы используете массив переменной длины.
С другой стороны, если вы используете указатель, размер стекового кадра известен (указатель имеет известный размер), и все в порядке.
Если вы хотите попробовать, это должно хорошо скомпилироваться
int (*m)[1000]=new int[oConstanta][1000]
, поскольку это статический массив фиксированного размера, записи которого являются динамически размещаемыми массивами переменной длины (разрешено).
Вкратце: всякий раз, когда размер объекта неизвестен во время компиляции, этот объект не может быть в стеке, он должен выделяться динамически.