Выделение памяти для структур

Практическая работа №1 «Структуры»

Цель работы

Изучить особенности работы с составным типом данных – структуры.

Краткие теоретические сведения

Производные типы

Из базовых типов можно формировать производные типы, к которым относятся: указатели, массивы, функции, структуры и объединения.

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

Различие между агрегирующими и неагрегирующими типами можно рассмотреть на примере массивов и скалярных данных базовых типов. Обычно агрегирующий тип включает несколько компонентов (массив из 12 элементов, каждый из которых принадлежит к одному и тому же типу). Для агрегирующего типа данных (например, для массива) в основной памяти ЭВМ выделяется такое количество памяти, чтобы сохранить (разместить) одновременно значения всех элементов.

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

Структурный тип

Этот тип (производный агрегирующий) задает внутреннее строение определяемых с его помощью структур.

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

Формат определения структурного типа:

struct имя_структурного_типа

{

тип_1 элемент_1;

тип_2 элемент_2;

тип_n элемент_n;

};

struct – спецификатор структурного типа

имя_структурног_типа – идентификатор, произвольно выбираемый программистом.

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

Конструкция struct имя_структурного_типа играет ту же роль, что и спецификаторы типов, например double или int.

Определения структур

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

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

Если определен структурный тип и известно его имя, то формат определения конкретных структур имеет вид:

struct имя_структурного_типа список_структур;

Структуры могут быть определены одновременно с определением структурного типа:

struct имя_структурного_типа

{определения элементов}список_структур;

Пример:

struct student

{

char name[15];//имя

char surname [20];//фамилия

int year;//курс

} student1, student2, student3;

Здесь определен структурный тип с именем student и три конкретные структуры student1, student2, student3, которые являются полноправными объектами. В каждую из этих трех структур входят элементы, позволяющие представить имя, фамилию, курс студента.

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

struct student leader, freshman;

Другой вариант определения структур является некоторым упрощением приведенного варианта. Дело в том, что можно определять структуры, приведя «внутренне строение» структурного типа, но не водя его название. Такой безымянный структурный тип обычно используется в программе для однократного определения структур.

struct

{определение_элементов} список_структур;

Выделение памяти для структур

Определение структурного типа не связано с выделением памяти, а при каждом определении структуры (объекта) ей выделяется память в таком количестве, чтобы могли разместиться данные всех элементов.

Однако, никаких гарантий о непрерывном размещении элементов структур стандарт языка С не дает. Причиной появления неиспользованных участков памяти («дыр») могут явиться требования выравнивания данных по границам участков адресного пространства. Эти требования зависят от реализации, от аппаратных возможностей системы и иногда от режимов (опций) работы компилятора.

Необходимость в выравнивании данных зависит от конкретной задачи. Например, доступ к целым значениям выполняется быстрее, если они имеют четные адреса, то есть выровнены по границам машинных слов. Противоположное требование состоит в плотной «упаковке» информации, когда идет борьба за уменьшение объема, занимаемого в памяти структурой или массивом структур.

В зависимости от наличия «пропусков» между элементами изменяется общий объем памяти, выделяемый для структуры. Реальный размер памяти в байтах, выделяемый для структуры, можно определить с помощью операции sizeof(имя_структуры)

sizeof(имя_структурного_типа)

Наши рекомендации