Другие языки программирования и технологии

как вернуть двумерный динамический массив из функции С++

По указателю на указатель.. .

#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;
typedef unsigned int index_t;
int ** random(const size_t, const size_t);
void show(int **, const size_t, const size_t);
void destroy(int **, const size_t);
int main() {
    cout << " Rows: "; size_t rows; cin >> rows;
    cout << " Cols: "; size_t cols; cin >> cols;
    int ** matrix = NULL;
    if (matrix = random(rows, cols)) {
        show(matrix, rows, cols);
        destroy(matrix, rows);
        matrix = NULL;
    }
    cin.get(); cin.get();
    return 0;
}
int ** random(const size_t _rows, const size_t _cols) {
    srand(unsigned(time(NULL)));
    int ** matrix = NULL;
    bool flag = false;
    if (matrix = new (nothrow) int * [_rows])
        for (index_t row = 0; row < _rows; row++) {
            if (matrix[row] = new (nothrow) int [_cols])
                for (index_t col = 0; col < _cols; col++)
                    matrix[row][col] = rand();
            else {
                destroy(matrix, _rows);
                flag = true;
                break;
            }
            if (flag) break;
        }
    return matrix;
}
void show(int ** _matrix, const size_t _rows, const size_t _cols) {
    for (index_t row = 0; row < _rows; row++, cout << endl)
        for (index_t col = 0; col < _cols; col++)
            cout << setw(8) << _matrix[row][col];
}
void destroy(int ** _matrix, const size_t _rows) {
    if (_matrix) {
        for (index_t row = 0; row < _rows; row++)
            if (_matrix[row])
                delete[] _matrix[row];
        delete[] _matrix;
    }
}
Байкулов Кайрат
Байкулов Кайрат
64 213
Лучший ответ
В C++ нет типа "динамический массив". И нет типа "двумерный массив". Если массивы в куче и есть массивы массивов.
А вообще - возвращай ссылку.
ПС
Паша Сергоян
92 509
вообще вопрос сложный

смотрите как используется:

int (*pArray)[4];

pArray = new int [12][4];

delete [] pArray;

говорят что массив pArray имеет тип int (*)[4]
но такой тип функцией возвратить нельзя, поэтому его приводят к типу (int**)

int ** function(){
int (*pArray)[4];
pArray = new int [12][4];
return (int**)pArray;
}

на практике рекомендую пользоваться одномерными массивами а индекс вычислять по ходу, например y*step+x
Галина Крюкова
Галина Крюкова
39 908
Как указатель на его нулевой элемент. По-другому никак.