Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Размещение структурных переменных в памяти



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

структурные переменные, являющиеся элементами массива, начинаются на границе слова, т.е. с четного адреса;

любое поле структурной переменной начинается на границе слова, т.е. с четного адреса и имеет четное смещение по отношению к началу переменной;

при необходимости в конец переменной добавляется пустой байт, чтобы общее число байт было четное.

Некоторые особенности:

поля структуры, как правило, имеют разный тип, кроме функций, файлов и самой этой структуры;

поля не могут иметь атрибут класс памяти, данный атрибут можно определить только для всей структуры;

идентификаторы как самой структуры, так и ее полей могут совпадать с идентификатарами других объектов программы, т.к. шаблон структуры обладает собственным пространством имен;

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

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

Пример на использование структур

Вести сведения о студентах учебной группы (не более 50):

а) фамилию и имя;

в) итоги сдачи экзаменов – три оценки.

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

Текст программы может иметь вид:

#include <iostream.h>

#include <stdio.h>

#include <string.h>

#include <conio.h>

struct Spisok {

char Fio[20];

int Ot[3];

float S_Bal;

} *sved;

void Vvod(int nom,struct Spisok *sved)

{ cout << "\n Vvedi svedenia " << (nom+1);

cout << "\n FIO - "; gets(sved->Fio);

float s=0;

for(int i=0;i<3;i++) {

cout << "\n Otcenki - "; cin >> sved->Ot[i];

s+=sved->Ot[i];

}

sved->S_Bal=s/3.;

return; }

void main(void)

{ struct Spisok Stud[50]; int i,N; char Bukva;

clrscr();

cout << "\n Vvedi kol-vo < 50 "; cin >> N;

for(i=0;i<N;i++) Vvod(i,&Stud[i]);

cout << "\n Spisok Students";

for(i=0;i<N;i++)

printf("\n %20s %4.2f",Stud[i].Fio,Stud[i].S_Bal);

cout << "\n Poisk FIO (bukva) "; cin >> Bukva;

cout << "\n Sveden Students";

int kod_p=0;

for(i=0;i<N;i++)

if(Stud[i].Fio[0]==Bukva){ kod_p=1;

printf("\n %20s %4.2f",Stud[i].Fio,Stud[i].S_Bal); }

if(kod_p==0) cout << " Takix HET!";

cout << "\n Poisk zapisi";

Vvod(-1,sved);

kod_p=0;

for(i=0;i<N;i++)

if(memcmp(sved,&Stud[i],sizeof(sved))==0)

{ kod_p=1;

printf("\n %20s %4.2f",Stud[i].Fio,Stud[i].S_Bal);

}

if(kod_p==0) cout << " Takix HET!";

getch();

}





Дата публикования: 2014-11-28; Прочитано: 350 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.011 с)...