3

我知道如何将内存分配给二维数组,但如果 ptr 定义为int *ptr[][100];

那我该如何分配内存ptr呢?

4

2 回答 2

2

引用 C 标准的第 6.2.5 节:

未知大小的数组类型是不完整的类型。对于该类型的标识符,它是通过在稍后的声明中指定大小(具有内部或外部链接)来完成的。

因此,要使用它,int *ptr[][100];您必须链接到它的定义。如果您指定该长度,那么您将拥有一个指向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

使用malloc并指定 3D 数组所需的字节数。

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

其中 x、y 和 z 是 3d 数组的维度。

当然,您也可以使用其他类型的数组元素(浮点数、字符、结构),只需确保使用sizeof.

于 2012-10-21T14:04:01.100 回答