我毫无帮助地看了这个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数组,它还可以自动计算出界限?我知道我需要提供尺寸,但为什么?这是语言要求吗?
答案 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[][];
这与任何初始化程序的存在无关。