Выделение памяти


Ввод строки

Массивы строк

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

Для хранения списка символьных строк используется двумерный массив размером n´s, где n – максимальное количество строк (студентов в группе, инструментов в наборе), s – максимальное количество символов в строке с учетом символа окончания строки ‘\0’.

Например,

char name[25][30];

Для хранения массива name в оперативной памяти будет отведено 750 байт непрерывного пространства для хранения 25 строк длиной не более 30 символов каждая (с учетом символа окончания строки).

Инициализация двумерного массива выполняется следующим образом:

char name[25][30] = {

{“Строка 1”},

{“Строка 2”},

:

:

{“Строка n”}

};

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

Например,

char g[3][15] = {

“Иванов И. И.”,

“Антонов Л. А.”,

“Попов С. М.”,

};

Для экономии оперативной памяти и избежания переполнения выделенного пространства под строку (что приводит к потери конечных символов, в том числе символа окончания строки ‘\0’) применяют описание совокупности строк с использованием одномерного массива указателей, размер которого равен числу инициализируемых строк.

Например,

char *pg[3] = {

“Иванов И. И.”,

“Антонов Л. А.”,

“Попов С. М.”,

};

Такое описание определяет массив, где количество строк равно количеству инициализируемых строк, а количество столбцов каждой строки массива определяется количеством символов в ней плюс символ окончания строки ‘\0’.

В оперативной памяти выделяются ячейки как для хранения массива указателей, так и для хранения списка строк.Схема выделения оперативной памяти имеет вид

                                   
  pg[0] pg[1] pg[2]                          
                                   
  pg[0]                              
                                   
  И в а н о в   И .   И . \0        
                                   
  pg[1]                              
                                   
  А н т о н о в   Л .   А . \0      
                                   
  pg[2]                              
                                   
  П о п о в   С .   М . \0          
                                   
                                                                       

Компилятор выделяет три ячейки памяти для хранения элементов массива указателей pg, а также необходимое количество ячеек для хранения списка строк. Адреса каждой из строк записываются в соответствующие ячейки массива pg.

Процесс ввода строки выполняется в два этапа:

· выделение оперативной памяти для хранения символьной строки;

· ввод строки с использованием функций ввода.

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

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

Например,

char name[30];

Согласно этому оператору, будет выделено 30 байт для хранения строки длиной не более 29 символов (плюс символ \0).