C: как передать двойной указатель на функцию

Я получаю ошибку сегментации, когда я передаю двойные указатели на функцию для инициализации памяти

int main()
{
    double **A;
    initialize(A, 10, 10);
 ......
}

void initialize(double **A, int r, int c)
{
   A = (double **)malloc(sizeof(double *)*r);
   for(int i = 0; i< r; i++) {
        A[i] = (double *)malloc(sizeof(double) *c);
        for(int j = 0; j < c; j++) {
            A[i][j] = 0.0;
        }
   }
}

Как я могу передать двойные указатели на функции.....

5 ответов


Если вы хотите изменить указатель на указатель, вы должны передать указатель на указатель на указатель.

void func(double ***data) { *data = malloc(sizeof(double*)*10); for.... };
double ** data; func(&data);

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

void initialize(double ***A, int r, int c)
{
   *A = (double **)malloc(sizeof(double *)*r);
   for(int i = 0; i< r; i++) {
        (*A)[i] = (double *)malloc(sizeof(double) *c);
        for(int j = 0; j < c; j++) {
            (*A)[i][j] = 0.0;
        }
   }
}

и main будет:

int main()
{
    double **A;
    initialize(&A, 10, 10);
}

кроме того, код, как вы его разместили, не должен вызывать ошибки сегментации при передаче A указатель. Ошибка сегментации, скорее всего, возникает, когда вы возвращаетесь из функции и пытаетесь получить доступ A, потому что A на main не будет инициализированный. Только копия инициализируется так, как вы это делаете, и эта копия локальна для initialize функция, поэтому она теряется, когда вы возвращаетесь.


Ну во-первых,A внутри initialize находится копия A на main -- Итак, когда вы вернетесь в main, его A еще не инициализирован. Если вы попытаетесь использовать его-бум!

передать initialize 'по ссылке', вам нужно изменить тип параметра на double*** и передать &A на main. Затем, когда вы используете его в initialize, вы должны разыменовать его каждый раз, т. е. *A.


  1. вы не проверяете наличие ошибок в памяти. Неудача.

  2. вы передаете по значению неинициализированное значение A для инициализации (), а затем инициализируете это. Но вернемся к main(), что локальная переменная A по-прежнему неинициализирована. Вместо этого вы могли бы инициализировать() возвращает double** (например,A = initialize(...)) или modify initialize (), поэтому его первым формальным параметром является double ***pA инициализации с *pA = (double**)malloc(...);


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

int main() 
{
    double **A;
    A = initialize(A10, 10);
}

double** initialize(int r, int c)
{
   double **A;
   A = malloc(sizeof(double *)*r);
   for(int i = 0; i< r; i++) {
        A[i] = (double *)malloc(sizeof(double) *c);
        for(int j = 0; j < c; j++) {
            A[i][j] = 0.0;
        }
   }
  return A;
}