Программирование на C и C++

Онлайн справочник программиста на C и C++

Инициализация безразмерных массивов

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

char e1[12] = "Read Error\n";
char e2[13] = "Write Error\n";
char e3[18] = "Cannot Open File\n";

Как можно было догадаться, было бы очень скучно вручную подсчитывать число символов каждого сообщения для определения корректной размерности массива. Имеется возможность определять размерность массива автоматически при использовании безразмерных массивов. Если размер массива не определен в инициализационной части, компилятор С автоматически создает массив с размером, достаточным для хранения всех указанных инициализаторов. Используя данный способ, можно переписать таблицу сообщений следующим образом:

char e1[] = "Read Error\n";
char e2[] = "Write Error\n";
char e3[] = "Cannot Open File\n";

Имея такую инициализацию, оператор

printf("%s has length %d\n", e2, sizeof e2);

выводит

write error
has length 13

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

Инициализация безразмерных массивов не ограничивается одномерными массивами. Для многомерных массивов необходимо определить все размерности, кроме самой левой, чтобы С мог правильно индексировать массив. (Аналогично определению параметров массива.) Используя данный способ, можно создавать таблицы с переменной длиной, и компилятор будет автоматически выделять необходимое для их хранения место. Ниже показано объявление sqrs как безразмерного массива:

Int sqrs[][2] = {
1, 1
2, 4,
3, 9,
4, 16,
5, 25,
6, 36,
7, 49,
8, 64,
9, 81,
10, 100
};

Преимущество данного объявления над версией с размерами состоит в том, что таблица может удлиняться или укорачиваться без изменения размерностей массива.