Определение структурного типа не связано с выделением памяти, а при каждом определении структуры (объекта) ей выделяется память в таком количестве, чтобы могли разместиться данные всех элементов.
Однако, никаких гарантий о непрерывном размещении элементов структур стандарт языка С не дает. Причиной появления неиспользованных участков памяти («дыр») могут явиться требования выравнивания данных по границам участков адресного пространства. Эти требования зависят от реализации, от аппаратных возможностей системы и иногда от режимов (опций) работы компилятора.
Необходимость в выравнивании данных зависит от конкретной задачи. Например, доступ к целым значениям выполняется быстрее, если они имеют четные адреса, то есть выровнены по границам машинных слов. Противоположное требование состоит в плотной «упаковке» информации, когда идет борьба за уменьшение объема, занимаемого в памяти структурой или массивом структур.
В зависимости от наличия «пропусков» между элементами изменяется общий объем памяти, выделяемый для структуры. Реальный размер памяти в байтах, выделяемый для структуры, можно определить с помощью операции sizeof(имя_структуры)
|
|
sizeof(имя_структурного_типа)
Инициализация и присваивание структур
Инициализация структур похожа на инициализацию массивов. Непосредственно в определении конкретной структуры после ее имени и знака = в фигурных скобках размещается список начальных значений элементов.
struct goods {
char * name;//наименование
long price;//оптовая цена
float percent;//наценка в процентах
int vol;//объем партии
char date [9];//дата поставки партии
};
struct goods coat = {
“пиджак черный”, 4000, 7.5, 220, «12.01.97»
};
Стандарт языка С разрешает присваивание структур. Однако для структур не определены операции сравнения даже на равенство. И сравнивать структуры нужно только поэлементно.