Определение размера памяти, выделяемой под структуру



Размер памяти, занимаемый структурным объектом, можно вычислить, исходя из размеров элементов структуры либо с помощью операции:

sizeof (ИмяСтруктуры)

sizeof (ИмяСтруктурногоТипа)

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

Например:

sizeof(struct goods) – 24 байта (из Примера 1)

sizeof(goods) – 24 байта (из Примера 1)

sizeof coat – 24 байта (из Примера 1)

sizeof(complex) – 16 байтов (из Примера 2)

 

Пример 3 . Программа вывода размера памяти для структурного объекта

#include "stdafx.h"

#include <iostream>

using namespace std;

struct A {

       int j;

       char titl[10];

       char x;

      } Aa, Ab={128, "Мир", 'Q'};

 

int _tmain(int argc, _TCHAR* argv[]) {

printf("\nAb.j=%d Ab.titl=%s Ab.x=%c", Ab.j, Ab.titl, Ab.x);

printf("\nПамять для объекта Аа равна %d байт ", sizeof (Aa));

system("pause");

return 0;

}

Результат выполнения программы:

Ab.j=128 Ab.titl=Мир Ab.x=Q

Память для объекта Аа равна 16 байт

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

Массив структур – это массив, каждый элемент которого является структурой. В памяти элементы массива структур размещаются последовательно.

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

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

Например:

#include "stdafx.h"

#include <iostream>

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[]) {

struct Student {

             char name[30];

             char group[10];

             float rating;

            };

Student mas[35]; //массив структур

int i;

 

//ввод значений массива

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

cout << "\nВведите имя: ";cin >> mas[i].name;

cout << "\nВведите группу: ";cin >> mas[i].group;

cout << "\nВведите рейтинг: ";cin >> mas[i].rating;

}

//вывод студентов, у которых рейтинг меньше 3

cout << "Рейтинг < 3: ";

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

if(mas[i].rating<3)

cout << "\n" << mas[i].name;

system("pause");

return 0;

}

 

Пример 4 . Программа определяет и печатает название самой высокой вершины из списка

#include "stdafx.h"

#include <iostream>

using namespace std;

struct peak {

        char name[15];//название вершины

        int height; //высота вершины

       } list[30]; //массив структурного типа peak

int N;

 

void InputDate();

void PrintMaxPic();

 

int _tmain(int argc, _TCHAR* argv[]) {

InputDate();

printf("\n");

PrintMaxPic();

system("pause");

return 0;

}

 

void InputDate() {

int i;

printf("Введите количество вершин: "); scanf("%d",&N);

printf("\n");

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

printf("Название: ");

scanf("%s",&list[i].name);

printf("Вершина: ");

scanf("%d",&list[i].height);

}

}

 

void PrintMaxPic(){

int i,max=list[0].height,num=0;

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

if (list[i].height>max) {

max=list[i].height;

num=i;

}

printf("Самая высокая вершина - %s, она равна ­ %d",

     list[num].name,max);

}

 

Пример 5 . Программа инициализирует массив структур, сортирует и выводит его на печать.

#include "stdafx.h"

#include <iostream>

using namespace std;

#include <time.h>

#define num 5

struct {

   char name[15];

   int grade;

  } x[num];

 

void init(void);

int sorts(const void *p1, const void *p2);

void print(void);

 

int _tmain(int argc, _TCHAR* argv[]) {

printf("\n Введите имена:\n");

init();

printf("\n Первоначальный массив\n");

print();

printf("\n Отсортированный массив\n");

qsort((void *)x, num, sizeof(x[0]), sorts);

print();

system("pause");

return 0;

}

 

void init(void){

int i, a=-10, b=10; 

srand(time(NULL)*1000);

for (i=0; i!=num; i++){

gets(x[i].name);

x[i].grade =int(rand()*1.0/(RAND_MAX)*(b-a)+a);

}

}

 

//сортируем по имени

int sorts(const void *p1, const void *p2){

return( strcmp((char *)p1,(char *)p2));

}

 

void print(void){

int t;

for (t = 0; t != num; t++)

printf("%s\t\t%d\n", x[t].name, x[t].grade);

}

Указатели на структуры

Указатель на структуру объявляется точно так же, как и указатель на данные простых типов: используется операция '*' и указывается тип данных. Тип данных структуры указывается заданием ключевого слова struct и имени шаблона этой структуры.

Синтаксис:

ИмяСтруктурногоТипа *ИмяУказателяНаСтруктуру

Например:

struct goods *p_goods;

struct student *p_stu1, *p_stu2;

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

Например:

struct {

    char *name;

    int age;

   } *person; //указатель на структуру

Если структура объявлена с помощью typedef, то при определении указателей название этого типа может использоваться без служебного слова struct.

Например:

complex *cc, *ss, comp;

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

Например:

struct particle {

            double mass;

            float coord[3];

           } dot[3], point, *pinega;

 

//Инициализация указателей

struct particle *p_d=&dot[1], *pinta=&point;

Значение указателя на структуру может быть определено и с помощью присваивания.

Например:

pinega=&dot[0];

При определении элемента структуры запрещено указание в качестве элемента самого себя (через структурный объект).

Например:

struct STUD { //некорректное объявление поля структуры

        STUD t;

       } a, b;

Однако элемент структуры может быть указателем на определяемую структуру.

Например:

struct STUD { //корректное объявление поля структуры

        STUD *pt;

       } a, b;

Кроме того, допустимо неполное определение типа структуры, если ее указатель является элементом другой структуры.

Например:

struct A; //неполное определение структурного типа

struct B {struct A *pta;};

struct A {struct B *ptb;};

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

Например:

struct part {

        double modul;

        struct cell *element_cell;

        struct part *element_part;

       };

struct cell {

        long summa;

        struct cell *one;

        struct part *two;

       };


Дата добавления: 2021-07-19; просмотров: 316; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!