2016-11-29 14 views
0

私はCで作業していますが、別の関数内で修正された関数の中にint **があります。私はこの問題を実行していたときにSegFaultを取得していたので、gdbでデバッグすることにしました。私が見つけたのは、メモリがこのアレイに割り当てられていないということでした。 aがアドレス0x0であることを示していると何のメモリを持たない私は$1 = (int **) 0x0を取得し、私は(プログラムのセグメンテーションフォルト前)ラインalocator(a, 4, 5)後にブレークポイントをgdbを実行すると私の関数は、この二重ポインタは関数内でmallocされません

void declarer() 
{ 
    int ** a; 
    alocator(a, 4, 5); 
    for (int i = 0; i < 4; i++) 
     for (int j = 0; j < 5; j++) 
      printf("%d\n", a[i][j]); 
} 

void alocator(int ** a, int b, int c) 
{ 
    a = (int **)malloc(sizeof(int *) * b); 
    for (int i = 0; i < b; i++) { 
     a[i] = (int *)malloc(sizeof(int) * c); 
     for (int j = 0; j < c; j++) 
      a[i][j] = j; 
    } 
} 

のようなもの、と私はp aを書きますそれのために割り当てられます。 alocatorはなぜメモリを割り当てられませんでしたか?また、aにメモリを割り当てるためにalocatorを取得するにはどうすればよいですか?

+2

'値でA'。 – alain

+1

"ダブルポインタ"は、通常は 'double *'です! – Olaf

答えて

2

**aを値で渡すので、ポインタとして渡す必要があります。その値は変更されませんので、あなたは、関数に値によって変数aを渡す

void declarer() 
{ 
    int **a; 
    alocator(&a, 4, 5); 
    ... 
} 

void alocator(int ***a, int b, int c) 
{ 
    *a = (int **)malloc(sizeof(int *) * b); 
    ... 
+0

これを使って 'a [i]'と 'a [i] [j]'をどうやって割り当てるのですか?それを '* a [i]'と '* a [i] [j]'と呼ぶ必要がありますか? –

+1

@EliSadoff 'allocator()'の内側にあります。または '(* a)[i] [j]'、私は優先順位を覚えていません。 – Havenard

+2

'(* a)[i] [j]' – alain

0

:だからトリプルポインタを使用しています。

int ***の値を受け入れ、アドレスでaを渡すか、関数の戻り値をint **に変更し、呼び出し時にその値を使用します。

例:あなたが渡すため

void declarer() 
{ 
    int ** a = alocator(4, 5); 
    for (int i = 0; i < 4; i++) 
     for (int j = 0; j < 5; j++) 
      printf("%d\n", a[i][j]); 
} 

int **alocator(int b, int c) 
{ 
    int **a = (int **)malloc(sizeof(int *) * b); 
    for (int i = 0; i < b; i++) { 
     a[i] = (int *)malloc(sizeof(int) * c); 
     for (int j = 0; j < c; j++) 
      a[i][j] = j; 
    } 
    return a; 
} 
関連する問題