2

これを実行するとセグメント化エラーが発生しますが、エラーは発生しません。 私はポインターの配列にポインターを渡し、ポインタの配列として初期化し、配列を埋め、呼び出し元の関数で利用可能なデータを取得しようとしています。参照で空の配列を渡し、関数内で初期化します。

static void test4(int ***arr) 
{ 
    int *values = (int *) MEM_mallocN(sizeof(int) * 3, "*values"); 
    values[0] = 0; 
    values[1] = 1; 
    values[2] = 2; 
    *arr = (int **) MEM_mallocN(sizeof(int *) * 3, "*arr"); 
    *arr[0] = &values[0]; 
    *arr[1] = &values[1]; 
    *arr[2] = &values[2]; /* this line causes crash */ 
} 

static void test3(void) 
{ 
    int **arr = NULL; 
    test4(&arr); 
    for (int i = 0; i < 3; i++) { 
     printf("arr[%d] = %p \n", i, arr[i]); 
    } 
    for (int i = 0; i < 3; i++) { 
     printf("arr[%d] = %d \n", i, *arr[i]); 
    } 
} 
+4

'* arr [0]'は '(* arr)[0]'ではなく '*(arr [0])'です。 – Ryan

+2

ポインターからポインターへのポインタが必要な理由はありません。この乱雑な3つ星のプログラミングの代わりに、[多次元配列を正しく割り当てる](https://stackoverflow.com/questions/42094465/correctly-allocating-multi-dimensional-arrays)をお勧めします。 – Lundin

+0

Cには参照がありません。ポインタを使用します。そして、3スターのプログラマーであることは賛辞ではありません。 – Olaf

答えて

2

あなたが後置添字演算子[]は*単項演算子よりも優先順位が高い

(*arr)[0] = &values[0]; 
(*arr)[1] = &values[1]; 
(*arr)[2] = &values[2]; 

を意味するようです。

関連する問題