Почему не удалось выделить память при передаче указателя в качестве аргумента - PullRequest
0 голосов
/ 19 марта 2019

Я только что попробовал два куска кода, чтобы выделить непрерывную память для 2D-массива и использовать g ++ для компиляции кода.Второй кусок кода работает хорошо, но первый приведет к ошибке сегментации (ядро сброшено).Что не так с первым фрагментом кода и чем они отличаются.

Спасибо за вашу помощь!

void mem_alloc2D(double **U, unsigned Nx, unsigned Ny) {
    U = new double*[Nx];
    U[0] = new double[Nx*Ny];
    for (unsigned r = 1; r < Nx; ++r)
        U[r] = U[0] + r*Ny;
}

double **mem_alloc2D(unsigned Nx, unsigned Ny) {
    double **U;
    U = new double*[Nx];
    U[0] = new double[Nx*Ny];
    for (unsigned r = 1; r < Nx; ++r)
        U[r] = U[0] + r*Ny;
    return U;
}

1 Ответ

3 голосов
/ 19 марта 2019

В первом фрагменте вы передаете двойной указатель по значению. Поэтому, когда вы вызываете mem_alloc2D(p, Nx, Ny) указатель p, который вы передаете, не «обновляется» при выходе из функции. Передача указателя по ссылке

void mem_alloc2D(double** &U, unsigned Nx, unsigned Ny)

должно заставить его работать.

Во втором фрагменте вы возвращаете только что созданный указатель, поэтому он работает нормально.

...