在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}};