Определение глобальных и автоматических структур

Структура — один из самых полезных инструментов языка Си. Глобальные структуры определяются вне функций. Автоматические структуры определяются внутри функций. Вы объявляете структуру, вставляя ее имя и идентификаторы полей в текст программы.

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

Автоматические структуры локальны для своей определяющей функции, т.е. только определяющая функция может непосредственно использовать эту структуру и последняя автоматически удаляется, когда функция завершается. Простой оператор, резервирующий память для объекта aSrtuct типа ANYSTRUCT, имеет вид:

ANYSTRUCT aStruct;

Если этот оператор встречается вне функции, он создает глобальный объект в сегменте данных программы. Если этот оператор встречается внутри функции, то возникает автоматический объект, который автоматически создается при вызове данной функции и удаляется по ее окончании. Расположение сегмента данных и стека определяется самой системой Windows.

Замечание. В расширенном режиме Windows процессор адресует память не напрямую, а через селекторы, которые отображаются на физические адреса. Windows может также преобразовывать часть пространства жесткого диска в виртуальную память. Этот факт означает, что объекты могут вытесняться на диск или перемещаться по памяти, освобождая при этом место для других данных, а затем автоматически возвращаться в память по старым или новым адресам. К счастью, все сказанное происходит без участия прикладной программы, которой в большинстве случаев даже не нужно знать об этих закулисных манипуляциях с памятью.

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

x=aStruct.count;

Чтобы указать адрес объекта, используйте aStruct с символом ам-персанда (&) в начале имени. Например, для указания адреса элемента count структуры aStruct применяйте обозначение &aStruct.count. Вы можете передать aStruct по адресу в функцию, параметр которой объявлен как ANYSTRUCT * (указатель на объект типа ANYSTRUCT):

f(&aStruct);

Чтобы передать aStruct по значению в функцию с параметром типа ANYSTRUCT (а не указатель на объект данного типа), просто укажите имя структуры:

f(aStruct);

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

Предупреждение. Объявление больших структур как глобальных может быстро исчерпать 64К-байтовый предел сегмента данных программы. По этой причине самые большие структуры должны быть размещены в динамической памяти Windows, как будет показано далее.

 

Реклама

Смежные разделы