2014-09-18 4 views
0

Я хочу иметь функцию, которая инициализирует динамические 2d массивы в СРР, как показано нижемногомерные инициализации массива с помощью указателей

void initArrays(int n,double **a,double **b,double **c) { 
a = new double*[n]; 
for (int i = 0; i < n; i++) 
    a[i] = new double[n]; 
b = new double*[n]; 
for (int i = 0; i < n; i++) 
    b[i] = new double[n]; 
c = new double*[n]; 
for (int i = 0; i < n; i++) 
    c[i] = new double[n]; 
} 

Вызов функции завершается, но это не инициализировать указатели, которые я даю в качестве аргументов функции. Например, если я называю эту функцию в главном

double **x,**y,**z; 
initArrays(3,x,y,z); 

Я не могу получить доступ к

x[0][0] 

, что я делаю неправильно здесь?

+0

Возможный дубликат [Как объявить 2-й массив в C++ с использованием новых?] (Http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c -using-new) – CoryKramer

+0

Это работает, если init выполняется в основном, как описано в вопросе выше. Это не удалось, когда я переместил init в функцию, которая вызывается в главном – AlphaWolf

+1

Не используйте 'new' в C++, у нас есть' std :: vector' и 'std :: unique_ptr'. Не используйте массивы массивов как 2D-массив, скорее используйте 1D-массив с размером 'x * y' и сопоставьте доступ. – Fytch

ответ

4

Указатели остаются неинициализированными, потому что вы никогда не назначаете им значение. Указатели в вашей функции init являются копиями тех, которые вы передали. Вы можете передать указатели по ссылке:

void initArrays(int n,double **&a,double **&b,double **&c) 

Это говорит, вы, вероятно, будет лучше с std::vector.