- •Цели и задача работы
- •2. Краткие теоретические сведения*
- •2.1 Основные функции для работы с динамической памятью
- •2.2. Случай двумерного динамического массива
- •3. Порядок выполнения работы
- •4. Варианты заданий
- •5. Содержание отчета
- •6. Пример решения задачи
- •7. Контрольные вопросы
- •Список рекомендуемой литературы
УТВЕРЖДАЮ
Ректор университета
____________ А.В. Лагерев
«___» ____________ 2009 г.
ПРОГРАММИРОВАНИЕ НА ЯЗЫКАХ ВЫСОКОГО УРОВНЯ
РАБОТА С ДИНАМИЧЕСКОЙ ПАМЯТЬЮ
Методические указания к выполнению лабораторной работы №7
для студентов 1 курса очной формы обучения
специальностям 230105 «Программное обеспечение
вычислительной техники и автоматизированных систем» и 010503 «Математическое обеспечение и администрирование информационных систем»
Брянск 2009
УДК 539.3
П рограммирование на языках высокого уровня. Работа с динамической памятью: методические указания к выполнению лабораторной работы №7 для студентов 1 курса очной формы обучения специальностям 230105 «Программное обеспечение вычислительной техники и автоматизированных систем» и 010503 «Математическое обеспечение и администрирование информационных систем».
Брянск: БГТУ, 2009. – 16 с.
Разработал А.П. Бабин,
канд. техн. наук
Рекомендовано кафедрой «Информатика и программное обеспечение» БГТУ (протокол № 6 от 13.02.09)
Цели и задача работы
Цели работы:
Изучить принципы работы с динамической памятью
Научиться создавать многомерные динамические массивы данных
Научиться использовать особенности данных (на примере двумерной матрицы) для более эффективной работы с памятью.
Задача: Составить программу на алгоритмическом языке Си по заданию преподавателя.
Продолжительность работы – 4 часа.
2. Краткие теоретические сведения*
2.1 Основные функции для работы с динамической памятью
Данные, которые создаются, инициализируются и уничтожаются по требованию программиста, называются динамическими. Для управления такими данными используются специальные стандартные функции, прототипы которых описаны в заголовочном файле <alloc.h>
Для запроса динамической памяти служит функция malloc(), которая имеет следующий прототип:
void* malloc(unsigned int size);
Функция malloc() выделяет область динамической памяти, размером size байт, и возвращает адрес этой области памяти.
В том случае, когда функция malloc() не может удовлетворить запрос на память, она возвращает значение NULL, то есть значение не существующего указателя.
П
*По
материалам лекций А.Н. Прасолова
После того как выполнена вся работа с выделенной областью памяти, ее следует освободить с помощью функции 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().