Инициализация массивов.

Имеется три способа инициализации массивов:

· По умолчанию во время их создания. Применимо только к глобальным и статическим (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) для символьных типов, а регистровые массивы содержат какой-то мусор, оставшийся в этой части памяти