3

メモリを 2 次元配列に割り当てる方法は知っていますが、ptr が次のように定義されている場合int *ptr[][100];

次に、どのようにメモリを割り当てることができptrますか?

4

2 に答える 2

2

C標準のセクション6.2.5からの引用:

サイズが不明な配列型は不完全な型です。そのタイプの識別子については、後の宣言でサイズを指定することによって完了します (内部または外部リンケージを使用)。

したがって、使用int *ptr[][100];するには、その定義に対してリンクする必要があります。その長さを指定すると、 へのポインタの 2D 配列が得られintます。この時点で、3D 配列に十分な大きさのメモリのチャンクを割り当てint *、2D 配列のそれぞれを正しく割り当てる必要があります。

より直接的なアプローチは、次のようになります。

int nx = 100;
int ny = 200;
int nz = 300;

int (*parray)[ny][nz] = malloc(nx*ny*nz*sizeof(int));

最後の行は、int の配列の配列へのポインターを割り当てます。これは、3D 配列のように効果的に使用できます。例えば:

for(int ii = 0; ii < nx; ii++)
  for (int jj = 0; jj < ny; jj++)
    for (int kk = 0; kk < nz; kk++)
      parray[ii][jj][kk] = ii*ny*nz + jj*nz + kk;

この質問に対する受け入れられた答えは、型の配列へのポインタの使用に関する非常に素晴らしく正確な概要を提供します。

于 2012-10-21T14:28:43.377 に答える
1

malloc3D 配列に必要なバイト数を使用して指定します。

int *array3d = (int *)malloc(x * y * z * sizeof(int));

ここで、x、y、z は 3 次元配列の次元です。

もちろん、他のタイプの配列要素 (float、chars、structs) を使用することもできますが、sizeof.

于 2012-10-21T14:04:01.100 に答える