1

Cで次のように定義された配列がある場合:

int B[d1][d2][d3][d4][d5][d6][d7][d8][d9];

次に、「B」を 1 次元のものに変換するのは簡単です。しかし、次のように定義されている C の配列がある場合はどうなるでしょうか。

int********* A;
//which will be allocated as follows for example
A = (int*********) malloc(N*sizeof(int********));
for(int i=0; i<N; i++)
{
 //differentSizes will be distinct for every "i"
 //the same distinctness of sizes will be for every other 
 //inner parts of all inner for loops
 compute(&differentSizes);
 A[i] = (int********) malloc(differentSizes*sizeof(int*******));
 for(...)
 {
  ...
 }
}

「A」はすべての次元で非常に大きなサイズになり、「A」のすべての内部配列/サブ配列ですべて異なります。

私の質問:「A」を 1 次元のものに変換する効率的な方法はありますか? 可能であれば、簡単な例を示していただけますか? ありがとう!

4

2 に答える 2

2

あなたの問題はわかりません。多次元配列はメモリ内で連続しているため、型変換が機能します。

int B[13][37];
int *oneDimension = (int *)B;

これからはB、各次元のサイズから適切なオフセットを計算することで、 の要素にアクセスできます。上記の例を使用します。

int valueAtB_2_6 = oneDimension[2 * 13 + 6];
于 2012-10-17T15:59:39.287 に答える
1

配列が宣言される方法では、すべての内容がメモリ内で連続します。要素の数を決定できる場合は、配列を 1 次元の配列にコピーするか、元の配列を反復するだけで、何をしたいかによって異なります。

int* singleIndex = (int*)B;

for (int i = 0; i < d1 * d2...dN; i++)
{
    printf("Element # %d = %d\n", i, *singleIndex);
}

例えば。

配列のヒープ初期化を行っている場合、すべてのメモリがヒープ上に散在するため、これは機能しませんが、静的/スタック割り当て配列の場合は機能します。

于 2012-10-17T16:02:25.870 に答える