在C中声明一个数组而不给出大小

Ale*_*and 6 c arrays

声明这样的数组时:

int array[][] = {
    {1,2,3},
    {4,5,6}};
Run Code Online (Sandbox Code Playgroud)

我得到一个错误说:"数组类型具有不完整的元素类型"

到底是怎么回事??

Jon*_*ler 23

使用N维数组(N> 0),您需要定义N-1维的大小; 只有一个维度可供编译器确定,它必须是第一个维度.

你可以写:

int d1[] = { ... };
int d2[][2] = { ... };
int d3[][2][3] = { ... };
Run Code Online (Sandbox Code Playgroud)

等等.


Kri*_*ket 5

您需要指定除最高尺寸之外的所有尺寸。原因是编译器将分配一大块内存,而不是一组指向它们自己的小数组的指针数组。换句话说,

int array[][3][4] = ...;
Run Code Online (Sandbox Code Playgroud)

将分配一个大小为 3*4* 的连续内存区域(无论您在此处声明多少个 3x4 数组)。因此,稍后在您的代码中,您可以编写

array[1][2][3] = 69;
Run Code Online (Sandbox Code Playgroud)

为了找到在内存中写入 69 的位置,它从地址 (array) 开始,然后向前跳转 12*sizeof(int) 到达 array[1],加上 2*4*sizeof(int) 到达 array[ 1][2],加上 3*sizeof(int) 最终到达数组[1][2][3]的开头。与写作相比,例如,

int ***array = new int**[n];
for(i=0; i<n; i++)
{
  array[i] = new int * [3];
  for(j=0; j<4; j++)
    array[i][j] = new int[4];
}
Run Code Online (Sandbox Code Playgroud)

(抱歉,如果我的语法不准确……自从我不得不用 C 编写这样的代码以来已经有一段时间了)。在此示例中,数组指向 n*sizeof(int**) 字节长的代码块。该数组的每个元素都指向另一个大小为 3*sizeof(int*) 字节长的数组。这些数组的每个元素都指向另一个大小为 4*sizeof(int) 字节长的数组。在这种情况下,不需要计算 array[1][2][3] 位于地址(array + some)处,而是需要跟踪内存中的几个不同的指针,然后才能找到写入 69 的位置。