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

声明这样的数组时:

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

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

到底是怎么回事??

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

你可以写:

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

等等。

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

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

将分配一个大小为3 * 4 *的连续内存区域(但是你在这里声明了许多3x4arrays)。 因此,当你的代码稍后,你写

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

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

 int ***array = new int**[n]; for(i=0; i 

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

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

即在你的情况下

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