Объявление массива в C, не давая размер

При объявлении массива как это:

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

Я получаю ошибку при высказывании: "Тип массива имеет неполный тип элемента"

Что продолжается??

6
задан AlexBrand 22 July 2010 в 14:10
поделиться

3 ответа

Для N-мерного массива (N> 0) вам необходимо определить размеры N-1 измерений; компилятору может быть оставлено только одно измерение, и это должно быть первое измерение.

Вы можете написать:

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

Etc.

23
ответ дан 8 December 2019 в 03:38
поделиться

Вам нужно указать все размеры, кроме наибольшего. Причина в том, что компилятор собирается выделить один большой блок памяти, а не один массив указателей, указывающих на свои собственные маленькие массивы. Другими словами,

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) байт. В этом случае, вместо того чтобы вычислить, что массив array[1][2][3] находится по адресу (массив + что-то), ему пришлось бы пройти по нескольким различным указателям в памяти, прежде чем найти, куда записать 69.

4
ответ дан 8 December 2019 в 03:38
поделиться

Вы должны указать хотя бы все размеры, кроме самого большого.

т.е. в вашем случае

int array[][3] = {
    {1,2,3},
    {4,5,6}};
1
ответ дан 8 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: