Сбой динамического массива C++ 2D
-
10-07-2019 - |
Вопрос
Привет, у меня возникла проблема с 2D-динамическим массивом.
int main()
{
double **M;
int M_dimension;
int i;
M_dimension = 10;
M = new double *[M_dimension];
for (i=0;i<M_dimension;i++)
{
M[i] = new double[M_dimension];
}
M[0][0] = 1.0;
...
}
Программа работает, но я хотел бы инициализировать 2D-массив, используя такую функцию:
void initialize2D(double **M,int M_dimension)
{
int i;
M = new double *[M_dimension];
for (i=0;i<M_dimension;i++)
{
M[i] = new double[M_dimension];
}
}
В итоге программа выглядит так:
int main()
{
double **M;
int M_dimension;
int i;
M_dimension = 10;
initialize2D(M,M_dimension);
M[0][0] = 1.0; //crash
...
}
К сожалению, он выходит из строя в M[0][0] = 1.0;
Спасибо за любую помощь или предложения.
Решение
Вы проходите мимо M
по значению, а не по ссылке. initialize2D
необходимо изменить значение указателя на указатель M
так, что он указывает на выделенную память
Вместо этого попробуйте изменить сигнатуру функции на следующую:
void initialize2D(double **&M,int M_dimension)
Или
void initialize2D(double ***M,int M_dimension) {
...
*M = new double *[M_dimension];
...
}
Другие советы
Для работы необходимо передать ссылку на double **
вместо double **
, в противном случае изменение будет выполнено для указателя после присвоения M результата новый
теряется при выходе из функции.
проблема может быть в том, что вы объявляете целочисленный параметр, такой как int M_dimension void initialize2D (double ** M, int M_dimension)
и затем вы инициализируете динамический массив как: M [i] = новый двойной [M_dimension];
где возникает противоречие, потому что вы объявили переменную M_dimension как целое число, а затем использовали ее как двойное число
попробуйте это так: либо измените тип данных массива или M_dimension, чтобы оба они имели одинаковый тип данных.
надеюсь, это поможет вам
Почему бы вам не использовать std :: vector
или Boost.MultiArray
Было бы довольно легко определить двумерный массив как общий вектор векторов в C ++