Короче говоря: вы не можете возвращать и передавать 2D-массив этими способами. Используйте векторы (или массив векторов, как предложено в комментариях @ прежней известной_463035818).
Массив - это линейная часть памяти. Оператор []
принимает значение в памяти с некоторым смещением. Так что это равно arr[i] == *(arr + i)
. Для двумерных массивов компилятору необходимо знать все измерения, кроме одного, поэтому компиляция может использовать его следующим образом: arr[i][j] == *(arr + i * N + j)
. Когда вы передаете массив в функцию, вы должны указать размеры всех, кроме одного (или всех, вы хотите) измерений. Т.е. void f(int a[][5]);
О возврате 2D массивов. Массив в C ++ - это не тип, это особая форма объявления. Так что возвращать int[][]
просто не имеет смысла. Вы должны использовать какую-то оболочку (например, std::array
из std::vector
), которая будет копировать все данные.