Вам необходимо указать все размеры, кроме самых высоких.Причина в том, что компилятор собирается выделить один большой блок памяти, а не один массив указателей, указывающих на их собственные маленькие массивы.Другими словами,
int array[][3][4] = ...;
выделит одну непрерывную область памяти размером 3 * 4 * (сколько бы массивов 3x4 вы не указали здесь).Таким образом, когда позже в вашем коде вы пишете
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<n; i++)
{
array[i] = new int * [3];
for(j=0; j<4; j++)
array[i][j] = new int[4];
}
(извините, если мой синтаксис не точен ... прошло некоторое время, так как мне пришлось кодировать что-то подобное в C).В этом примере массив указывает на блок кода длиной n * sizeof (int **).Каждый элемент этого массива указывает на другой массив размером 3 * sizeof (int *) в длину.Каждый элемент этих массивов указывает на другой массив размером 4 * sizeof (int) длиной.В этом случае вместо того, чтобы вычислять этот массив [1] [2] [3] по адресу (массив + что-то), он должен будет следовать нескольким различным указателям в памяти, прежде чем найти место для записи 69.