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

时间:2010-07-22 14:10:58

标签: c arrays

声明这样的数组时:

int array[][] = {
    {1,2,3},
    {4,5,6}};

我收到错误消息:“数组类型具有不完整的元素类型”

发生了什么事?

3 个答案:

答案 0 :(得分:23)

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

你可以写:

int d1[] = { ... };
int d2[][2] = { ... };
int d3[][2][3] = { ... };

答案 1 :(得分:3)

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

int array[][3][4] = ...;

将分配一个大小为3 * 4 *的连续内存区域(但是您在此处声明了许多3x4阵列)。因此,当您稍后在代码中编写

array[1][2][3] = 69;

为了找到内存写入69的位置,它从地址(数组)开始,然后向前跳转12 * sizeof(int)到数组[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];
}

(抱歉,如果我的语法不准确......已经有一段时间了,因为我必须在C中编写类似的代码)。在此示例中,数组指向代码块n * sizeof(int **)bytes long。此数组的每个元素指向另一个大小为3 * sizeof(int *)bytes的数组。这些数组的每个元素都指向另一个大小为4 * sizeof(int)bytes的数组。在这种情况下,不是计算数组[1] [2] [3]是在地址(数组+东西),它需要在内存中跟随几个不同的指针,然后才能找到写入69的位置。

答案 2 :(得分:1)

你必须至少告诉它除了最大的所有维度。

即你的情况

int array[][3] = {
    {1,2,3},
    {4,5,6}};