Объявление массива в C без указания размера
При объявлении массива, подобного этому:
int array[][] = {
{1,2,3},
{4,5,6}};
Я получаю сообщение об ошибке: "Тип массива имеет неполный тип элемента"
Что происходит?
Ответы
Ответ 1
С N-мерным массивом (N > 0) вам нужно определить размеры размеров N-1; компилятор может определить только одно измерение, и это должно быть первое измерение.
Вы можете написать:
int d1[] = { ... };
int d2[][2] = { ... };
int d3[][2][3] = { ... };
Etc.
Ответ 2
Вам нужно указать все размеры, кроме самого высокого. Причина в том, что компилятор собирается выделить один большой блок памяти, в отличие от одного массива указателей, указывающих на собственные маленькие массивы. Другими словами,
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.
Ответ 3
Вы должны сказать ему хотя бы все размеры, кроме самых больших.
т.е. в вашем случае
int array[][3] = {
{1,2,3},
{4,5,6}};