Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Задание 2. Процедуры управления динамической памятью программы.






Указатели.

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

 

 

Цели работы:

– Усвоить понятия «динамическое распределние памяти», «статическое распределение памяти», работа с переменными при статическом и динамическом распределении памяти, «указатели».

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

– Создать простейший проект в системе QT Creator на языке С++, в котором осуществляется работа с переменными в динамической памяти.

 

Цель создания проекта:

 

Целью проекта является размещение трех переменных типа int, float, double в динамической памяти и вывод их значений на экран, а также анализ значений указателей на эти переменные до выделения памяти и после и проведения анализа этих исследований.

 

Задания для самопроверки:

Задание 1

 

1. Разместите в динамической памяти две переменные типа float и занесите в одну из них значение корня квадратного от 2.18, а в другую – синус от значения, которое находится в первой переменной.

 

float * pf1, * pf2; pf1 = new float; pf2 = new float; * pf1 = sqrt(2.18); * pf2 = sin(* pf1);

 

 

2. Разместите в динамической памяти две переменные типа структура, содержащую информацию о преподавателе: Фамилия, Кафедра, Должность, Зарплата. Одну переменную заполните следующей информацией: Иванов, ИКС, Доцент, 5000.

Затем скопируйте значение заполненной первой переменной во вторую и только поменяйте значение поля Фамилия на «Петров».

 

 

typedef struct { string name; string department; string post; int salary; } MyStruct; MyStruct * str1, * str2; str1 = new MyStruct; str2 = new MyStruct; * str1 = { " Гребенник", " ИКС", " Доцент", 5000}; * str2 = * str1;

str2-> name = " Петров";

 

 

3. Разместите в динамической памяти переменную типа массив из трех целых чисел и заполните его первый элемент значением 5.

 

int * ar = new int[3]; * ar = 5;

 

4. Разместите в динамической памяти массив из 10 структур, содержащих ту же информацию, что и записи в пункте 2 и заполните третий элемент этого массива информацией о вашем преподавателе.

 

typedef struct { string name; string department; string post; int salary; } MyStruct; MyStruct * strar = new MyStruct[10]; strar[2] = {" Гребенник", " ИКС", " Доцент", 5000};

 

 

Задание 2

Напишите программы, которые обеспечат следующее расположение данных в памяти:

1.

 

Статическая память  
P1
NULL

 

 

Динамическая память
 
 

 

 

 


int * P1;

int * P1 = new int;

P1 = 78;

int * P1 = new int;

* P1 = 56;

P1 = NULL;

 

2.

 

Статическая память  
P2
NULL
P3
P1

 


 

Динамическая память
 

 

 

 


int * P1, * P2, * P3;

P1 = new int;

* P1 = 78;

P2 = NULL;

P3 = new int;

3.

 

Статическая память  
P2
P3
P1

 


 

Динамическая память
 

 

 


int * P1, * P2, * P3;

P1 = new int;

* P1 = 78;

P3 = P2 = P1;

 

4.

 

Статическая память

 

P3
P1

 


 

Динамическая память
 
NULL
 

 


 

 

typedef struct {

int a;

void * P;

} MyStruct;

MyStruct * P1, * P2;

P1 = new MyStruct;

P2 = new MyStruct;

P1-> a = 78;

P1-> P = P2;

P2-> a = 56;

P2-> P = NULL;

 

5.

 

Статическая память

 

P3
P1

 


 

Динамическая память

NULL
Зима

 


‘Д ’
 

 

typedef struct {

int a;

char * c;

void * P;

} MyStruct1;

typedef struct{

string s;

void * P;

} MyStruct2;

MyStruct1 * P1;

MyStruct2 * P3;

P1 = new MyStruct1;

P3 = new MyStruct2;

P1-> c = new char;

*P1-> c = 'Д';

P1-> a = 78;

P1-> P = P3;

P3-> s = " Зима";

P3-> P = NULL;

 

Интерфейс проекта:

На рисунке 1.1 изображен интерфейс проекта.

 

Рисунок 1.1 – интерфейс проекта

Текст программы:

 

#include < iostream>

 

using namespace std;

 

void varInDynamicMemory();

 

int main()

{

varInDynamicMemory();

return 0;

}

 

void varInDynamicMemory() {

int * p1;

float * p2;

double * p3;

 

int i;

float f;

double d;

 

cout < < " Initial values for putting in dynamic memory: \nint flaot double: ";

cin > > i > > f > > d;

cout < < endl;

 

int iP1 = (int) p1;

int iP2 = (int) p2;

int iP3 = (int) p3;

 

cout < < " Values of pointers before putting in memory: \n";

cout < < " P1=" < < iP1 < < endl;

cout < < " P2=" < < iP2 < < endl;

cout < < " P3=" < < iP3 < < endl;

 

p1 = new int;

p2 = new float;

p3 = new double;

 

iP1 = (int) p1;

iP2 = (int) p2;

iP3 = (int) p3;

 

* p1 = i;

* p2 = f;

* p3 = d;

 

cout < < " Values of pointers after putting variables in memory: \n";

cout < < " P1=" < < iP1 < < endl;

cout < < " P2=" < < iP2 < < endl;

cout < < " P3=" < < iP3 < < endl;

 

cout < < " Values of dynamic variables: \n";

 

i = * p1;

f = * p2;

d = * p3;

 

cout < < " P1=" < < i < < endl;

cout < < " P2=" < < f < < endl;

cout < < " P3=" < < d < < endl;

}

 

Вывод

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

 

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

  Указатель Переменная
До выделения динамической памяти Неопределенное значение Мусор
После выделения динамической памяти Выделен адреса и размера в памяти, соответсвенно типу указателя Значение переменной

 

Таблица 1.1 – Значения указателей и переменных до и после выделения динамической памяти

 

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

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

 

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.