未指定两个边界的二维数组

时间:2016-10-12 03:12:32

标签: c arrays

我毫无帮助地看了这个SO post

int main()
{
  int a[][] = {{1,2},{3,4}};
}

错误

$ gcc  a.c                                                                      
a.c:6:8: error: array has incomplete element type 'int []'
  int a[][] = {{1,2},{3,4}};
       ^
1 error generated.

为什么a[][]类型不完整?

为什么int a[][2]没问题?

我会假设由于编译器可以初始化这个2-D数组,它还可以自动计算出界限?我知道我需要提供尺寸,但为什么?这是语言要求吗?

2 个答案:

答案 0 :(得分:2)

只有一个索引可以自动调整大小。否则你可以在尺寸上有任何一对因子。所以a[][2]有效,但a[][]没有,因为它无法猜测数组数组的大小。

答案 1 :(得分:1)

问题在于:

6.2.5类型
...
数组类型描述了具有特定成员对象类型的连续分配的非空对象集,称为元素类型只要指定了数组类型,元素类型就应该是完整的。数组类型的特征在于它们的元素类型和数组中的元素数。数组类型据说是从其元素类型派生的,如果其元素类型是 T ,则数组类型有时称为“ T ”数组。从元素类型构造数组类型称为“数组类型派生”。

2D数组实际上是一维数组,其中每个元素都有数组类型。你可以想到声明

T a[][N];

已写完

typedef T R[N];
R a[];

根据上述规则,R必须是完整类型;这意味着如果R是数组类型,则必须知道其大小。你不能写

typedef T R[];
R a[];

意思是你不能写

T a[][];

这与任何初始化程序的存在无关。