Инициализация массивов.
Имеется три способа инициализации массивов:
· По умолчанию во время их создания. Применимо только к глобальным и статическим (static) массивам.
· Явно во время создания при помощи констант инициализации.
· Во время выполнения программы при присваивании или копировании данных в массив.
Для инициализации массива во время создания можно использовать только константы. Если элементы массива должны получать значения из переменных, то в программном коде должны быть явные операторы инициализации массива.
Инициализация по умолчанию.
В стандарте ANSI С оговорено, что массивы бывают либо глобальные (описанные вне main() и любых других функций), либо автоматические static (статические, но описанные после какой-либо открывающей скобки), и при отсутствии инициализирующей информации они всегда получают значения двоичных нулей. В С числовые массивы инициализируются значением ноль. (Массивы указателей получают начальные значения null)
Явная инициализация.
Аналогично описаниям и инициализации переменных типов int, char, float, double и других вы можете инициализировать массивы. Стандарт ANSI С позволяет задавать и инициализирующие значения любого массива, глобального или иного, описанного в любой части программы. Следующий фрагмент кода иллюстрирует описание и инициализацию массивов:
int iarray[3] = {-1,0,1};
static float fpercent[4] = {1.141579,0.75,55E0,-.33E1} ;
static int idecimal[3] = {0,1,2,3,4,5,6,7,8,9};
Безразмерные массивы
Для большинства компиляторов безразлично — указываете ли вы размер массива, или задаете список фактических значений; важно указать либо то, либо другое. Например: в программах часто описывается набор собственных сообщений об ошибках. Это можно сделать двумя способами. Вот первый из них:
char e1[12] = "Ошибка чтения\n";char e2[13] = "Ошибка записи\n";char e3[18] = "Нельзя открыть файл\n";
При таком подходе необходимо считать количество символов в строке, не забывая добавить 1, чтобы учесть невидимый null-символ окончания строки \0. Это, в лучшем случае, очень утомительный для глаз метод, который чреват многими ошибками. При втором способе, показанном ниже, используются безразмерные массивы, и язык С автоматически определяет их размер:
char e1[] = "Ошибка чтения\n";char e2[] = "Ошибка записи\n";char e3[] = "Нельзя открыть файл\n";
Всякий раз, когда встречается оператор инициализации массива и размер массива не указан, компилятор автоматически выделяет достаточно места для всех указанных данных.
67.Массивы. Инициализация массивов и классы памяти. Вычисление размера массива (sizeof()). Выход индекса за пределы массива.
Инициализация массивов и классы памяти.
Для хранения данных, необходимых программе, часто используют массивы. Например, в массиве из 12 элементов можно хранить информацию о количестве дней каждого месяца. В подобных случаях желательно иметь удобный способ инициализации массива перед началом работы программы. Такая возможность, вообще говоря, существует, но только для статической и внешней памяти. Давайте посмотрим, как она используется.
Мы знаем, что скалярные переменные можно инициализировать в описании типа при помощи таких выражений, как, например:
int fix = 1;
Можем ли мы делать что-либо подобное с массивом? Ответ не однозначен: и да, и нет.
Внешние и статические массивы можно инициализировать. Автоматические и регистровые массивы инициализировать нельзя.
Прежде чем попытаться инициализировать массив, давайте посмотрим, что там находится, если мы в него ничего не записали.
main ()
{
int fuzzy[2]; /* автоматический массив */
static int wuzzy[2]; /* статический массив */
printf(" %d %d\n" , fuzzy[1], wuzzy[1]);
}
Если ничего не засылать в массив перед началом работы с ним, то внешние, статические и автоматические массивы инициализируются для числовых типов нулем и '\0' (null) для символьных типов, а регистровые массивы содержат какой-то мусор, оставшийся в этой части памяти