web-dev-qa-db-ja.com

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;
        }
   }
}

二重ポインタを関数に渡すにはどうすればよいですか。

14
veda

ポインタートゥポインターを変更する場合は、ポインタートゥポインタートゥポインターを渡す必要があります。

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

他の人が言ったように、あなたはあなたの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にアクセスしようとしたときに発生する可能性があります。 Amainは初期化されません。そのコピーのみが初期化され、そのコピーはinitialize関数に対してローカルであるため、戻ったときに失われます。

17
IVlad

まず、A内部初期化はA内のmainのコピーです-mainに戻ると、そのAはまだ初期化されていません。使ってみたら-ブーム!

これをinitializeに「参照」で渡すには、パラメーターのタイプをdouble***に変更し、main&Aを渡す必要があります。次に、それをinitializeで使用するときは、毎回逆参照する必要があります。つまり、*Aです。

1
Stuart Golodetz
  1. メモリ不足エラーをチェックしていません。不合格。

  2. 初期化されていない値AをBY VALUEに渡して、initialize()に渡し、それを初期化します。しかしmain()に戻ると、そのローカル変数Aはまだ初期化されていません。代わりに、initialize()が_double**_(例:A = initialize(...))を返すか、initialize()を変更して、最初の仮パラメーターが*pA = (double**)malloc(...);で初期化される_double ***pA_になるようにします。

1
Jan Gray

これは、あなたがしたくない種類のことです。これに不必要に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;
}
1
arsenm