Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб7 программирование.doc
Скачиваний:
3
Добавлен:
03.05.2019
Размер:
642.56 Кб
Скачать

17

УТВЕРЖДАЮ

Ректор университета

____________ А.В. Лагерев

«___» ____________ 2009 г.

ПРОГРАММИРОВАНИЕ НА ЯЗЫКАХ ВЫСОКОГО УРОВНЯ

РАБОТА С ДИНАМИЧЕСКОЙ ПАМЯТЬЮ

Методические указания к выполнению лабораторной работы №7

для студентов 1 курса очной формы обучения

специальностям 230105 «Программное обеспечение

вычислительной техники и автоматизированных систем» и 010503 «Математическое обеспечение и администрирование информационных систем»

Брянск 2009

УДК 539.3

П рограммирование на языках высокого уровня. Работа с динамической памятью: методические указания к выполнению лабораторной работы №7 для студентов 1 курса очной формы обучения специальностям 230105 «Программное обеспечение вычислительной техники и автоматизированных систем» и 010503 «Математическое обеспечение и администрирование информационных систем».

Брянск: БГТУ, 2009. – 16 с.

Разработал А.П. Бабин,

канд. техн. наук

Рекомендовано кафедрой «Информатика и программное обеспечение» БГТУ (протокол № 6 от 13.02.09)

  1. Цели и задача работы

Цели работы:

  1. Изучить принципы работы с динамической памятью

  2. Научиться создавать многомерные динамические массивы данных

  3. Научиться использовать особенности данных (на примере двумерной матрицы) для более эффективной работы с памятью.

Задача: Составить программу на алгоритмическом языке Си по заданию преподавателя.

Продолжительность работы – 4 часа.

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

2.1 Основные функции для работы с динамической памятью

Данные, которые создаются, инициализируются и уничтожаются по требованию программиста, называются динамическими. Для управления такими данными используются специальные стандартные функции, прототипы которых описаны в заголовочном файле <alloc.h>

Для запроса динамической памяти служит функция malloc(), которая имеет следующий прототип:

void* malloc(unsigned int size);

Функция malloc() выделяет область динамической памяти, размером size байт, и возвращает адрес этой области памяти.

В том случае, когда функция malloc() не может удовлетворить запрос на память, она возвращает значение NULL, то есть значение не существующего указателя.

П

*По материалам лекций А.Н. Прасолова

оскольку функция malloc() возвращает значение на произвольный тип данных (обозначается как void*), то возвращаемое значение должно быть явно преобразовано к нужному типу данных.

После того как выполнена вся работа с выделенной областью памяти, ее следует освободить с помощью функции free(), имеющей следующий прототип:

void free(void *block);

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

Если при вызове функции free() значение указателя block не соответствует адресу, возвращенному функцией выделения памяти, то результат выполнения функции free() непредсказуем, а область динамической памяти может быть вообще разрушена.

Не допускается также освобождать уже освобожденный блок памяти.

Рассмотрим типичную последовательность действий при работе с динамической памятью:

double *A; int n;

...

n = 200;

...

A = (double *) malloc( n * sizeof(double) );

...

/* Работа с массивом A */

...

free(A);

В рассмотренном фрагменте программы выделяется память для хранения n элементов типа double. Для совместимости никогда не следует явно задавать размер элемента данных. Нужно пользоваться операцией sizeof() – операция получения размера данных. Возвращаемое функцией malloc() значение в приведенном примере преобразуется к типу указателя на double (обозначается как double*).

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

В некоторых случаях бывает полезной функция calloc(), которая не только выделяет память, но и заполняет область выделенной памяти нулевыми значениями. Она имеет следующий прототип:

void * calloc(unsigned int nitems, unsigned int size);

Функция выделяет непрерывный блок памяти для nitems элементов данных размером size байт каждый и заполняет этот блок нулевыми значениями. В остальном ее работа аналогична работе функции malloc().