2017-02-18 10 views
0

Я хотел создать функцию, которая создает двухмерный динамический массив. поэтому я написал:Функция, которая создает двухмерный динамический массив

#include<iostream> 
using namespace std; 

void make_mat (double *** , int, int); 
int main(){ 
    int m = 3, n = 4; 
    double **a; 
    make_mat(&a,m,n); 

    for (int i = 0; i < m; i++) 
     for (int j = 0; j < m; j++) 
      cin >> a[i][j]; 
    for (int i = 0; i < m; i++){ 
     for (int j = 0; j < m; j++) 
      cout << a[i][j] << '\t'; 
     cout << endl; 
    } 
    return 0; 
    system("pause"); 
} 

void make_mat(double ***x , int m , int n){ 
    *x = new double *[m]; 
    for (int i = 0; i < m; i++){ 
     *x[i] = new double [n]; 
    } 
} 

Там нет синтаксических ошибок в кодах, но я получаю следующее сообщение об ошибке после компиляции:

необработанного исключения при 0x003657E6 в ConsoleApplication20.exe: 0xC0000005: нарушение прав доступа место для записи 0xCCCCCCCC.

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

+0

Определение gloval 'void main()' является незаконным в стандартном C++. Вы должны использовать 'int main()', если нет особых причин использовать нестандартный тип функции main() '. – MikeCAT

+0

ОК я сейчас отредактирую –

+1

Да, есть лучшая идея. Используйте летающий 'std :: vector'. –

ответ

2

*x[i] эквивалентен *(x[i]), что эквивалентно x[i][0].

Вы должны использовать (*x)[i] вместо *x[i] в функции make_mat().

+0

thanx, это сработало. является (x + i) равным (* x) [i]? –

+1

'a [i]' эквивалентно '* (a + i)'. '** (x + i)' эквивалентно '* (x [i])', что эквивалентно 'x [i] [0]'. Он не эквивалентен '(* x) [i]', что эквивалентно 'x [0] [i]'. – MikeCAT