a を渡しているdouble **array_ptr
ため、関数の外側のポインターは変更されません。
C++では、参照にすることで修正できます(new
C++であるため、を使用します)
int Malloc2D(int n, int m, double**& array_ptr) {
array_ptr = new double*[n]);
if (array_ptr == NULL) {
std::cout << "ERROR! new failed on line " << __LINE__ << "..." << std::endl;
return -1;
}
for (int i = 0; i < n; i++) {
array_ptr[i] = new double[m];
if (array_ptr[i] == NULL) {
std::cout << "ERROR! new failed on line " << __LINE__ << "..." << std::endl;
return -1;
}
}
return 0;
}
または、C スタイルの方法で、別のポインター間接化を使用することもできます (&test
呼び出しコードで を使用して のアドレスを渡しますdouble ** test
)。
int Malloc2D(int n, int m, double*** array_ptr) {
*array_ptr = (double**) malloc(n * sizeof(double*));
if (array_ptr == NULL) {
std::cout << "ERROR! malloc failed on line " << __LINE__ << "..." << std::endl;
return -1;
}
for (int i = 0; i < n; i++) {
(*array_ptr)[i] = (double*) malloc(m * sizeof(double));
if ((*array_ptr)[i] == NULL) {
std::cout << "ERROR! malloc failed on line " << __LINE__ << "..." << std::endl;
return -1;
}
}
return 0;
}
または、最初に配列へのポインターを返すだけでもかまいませんが、これには呼び出しコードにいくつかの小さな変更が必要になります。
double** Malloc2D(int n, int m) {
double** array_ptr;
array_ptr = (double**) malloc(n * sizeof(double*));
if (array_ptr == NULL) {
std::cout << "ERROR! malloc failed on line " << __LINE__ << "..." << std::endl;
return NULL;
}
for (int i = 0; i < n; i++) {
array_ptr[i] = (double*) malloc(m * sizeof(double));
if (array_ptr[i] == NULL) {
std::cout << "ERROR! malloc failed on line " << __LINE__ << "..." << std::endl;
return NULL;
}
}
return array_ptr;
}