1

私は私が次のような配列を定義する場合

int a [10];

ポインタ表記を使用して、を使用してアドレスにアクセスし、を使用a+<corresponding_item_in_array> して値にアクセスできます*(a+<corresponding_item_in_array>)

今、私は物事を逆転させたいと思っていました、私mallocは整数ポインタにメモリを割り当て、添え字表記でポインタを表現しようとしましたが、それは機能しませんでした

int *output_array;
output_array = (int *) (malloc(2*2*2*sizeof(int))); //i.e, space for 3d array

output_array[0][0][1] = 25;  
// ^ produces error: subscripted value is neither array nor pointer

ストレージマッピングを使用してポインター式を使用した可能性がありますが、より単純な方法を使用できませんか?なぜ?

4

3 に答える 3

3

このint*型は、3D配列型と同等ではありません。これは、1D配列タイプと同等です。

int *output_array;
output_array = (int *) (malloc(8*sizeof(int))); //i.e, space for array of 8 ints
output_array[5] = 25; // This will work

上位の配列の問題は、2D、3Dなどの配列にインデックスを付けるために、コンパイラがインデックスからのオフセットを正しく計算するために、最初の次元を除く各次元のサイズを認識している必要があることです。3D配列を処理するには、次のように2D要素を定義します。

typedef int element2d[2][2];

今、あなたはこれを行うことができます:

element2d *output_array;
output_array = (element2d*) (malloc(2*sizeof(element2d))); 
output_array[0][0][1] = 25; // This will work now

ideoneのデモ。

于 2013-02-28T02:00:03.663 に答える
1

の種類はoutput_array何ですか?int *

*(output_array+n)またはの種類は何output[n]ですか?int

下付き文字は許可されていintますか?両方の添え字(例*(output_array+n)output[n])はポインター操作でありint、ポインターではありません。これはあなたが受け取ったエラーを説明しています。

次のように、int[x][y]へのポインタを宣言できます。int (*array)[x][y];

array以下を使用して、3Dアレイの適切な代替手段であるストレージを割り当てることができますarray = malloc(42 * x * y);。これはint array[42][x][y];、配列が変更可能な左辺値ではなく、alignof、sizeof、およびaddress-of演算子の動作が異なり、保存期間が異なることを除いて、と同等です。

于 2013-02-28T02:13:56.553 に答える
0

コンパイラは各次元のサイズを認識していないため、どこにあるべきかを見つけることができoutput_array[0][0][1]ません。

あなたはこれを試すことができます

typedef int (* array3d)[2][2];
array3d output_array;
output_array = (array3d) malloc(2 * 2 * 2 * sizeof(int));
output_array[0][0][1] = 25;
printf("%d\n", output_array[0][0][1]);
于 2013-02-28T02:01:45.037 に答える