声明这样的数组时:
int array[][] = {
{1,2,3},
{4,5,6}};
我收到错误消息:“数组类型具有不完整的元素类型”
发生了什么事?
答案 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}};