Распределение памяти. Динамическое выделение памяти
Работа с динамической памятью с помощью библиотечных функций malloc (calloc) и free
Средства для динамического выделения и освобождения памяти описаны в заголовочных файлах malloc.h и stdlib.h стандартной библиотеки (файл malloc.h ).
Функции malloc(), calloc() и realloc() динамически выделяют память в соответствии со значениями параметров и возвращают адрес начала выделенного участка памяти. Для универсальности тип возвращаемого значения каждой из этих функций есть void *. Этот указатель можно преобразовать к указателю любого типа с помощью операции явного приведения типа ( тип * ).
Функция free() освобождает память, выделенную перед этим с помощью одной из трех функций malloc(), calloc() или realloc(). Сведения об участке памяти передаются в функцию free() с помощью указателя – параметра типа void *. Преобразование указателя любого типа к типу void * выполняется автоматически, поэтому вместо формального параметра void *bl можно подставить в качестве фактического параметра указатель любого типа без операции явного приведения типов.
Пример 2. Ввести и напечатать в обратном порядке набор вещественных чисел, количество которых заранее не фиксировано, а вводится до начала ввода самих числовых значений.
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ float* t; //Указатель для выделяемого блока памяти int i,n; printf("n=");//n - число элементов scanf("%d", &n); t=(float *)malloc(n*sizeof(float)); for (i=0; i<n; i++){ //цикл ввода чисел printf("x[%d]=",i); scanf("%f", &t[i]); } //цикл печати результатов for (i=n-1; i>=0; i--){ printf("\nx[%d]=%f",i,t[i]); } free(t); //освобождает память system("pause"); return 0; }
В программе int n – количество вводимых чисел типа float, float* t – указатель на начало области, выделяемой для размещения n вводимых чисел. Указатель t принимает значение адреса области, выделяемой для n значений типа float. Доступ к участкам памяти выделенной области выполняется с помощью операции индексирования: t[i] и t[i-1]. Оператор free(t); содержит вызов функции, освобождающей выделяемую ранее динамическую память и связанной с указателем t.
Ключевые термины
Динамическая память – это память, выделяемая программе для ее работы за вычетом сегмента данных, стека, в котором размещаются локальные переменные подпрограмм и собственно тела программы.
Динамические переменные – это переменные, определенные в области динамической памяти.
Операция выделения динамической памяти – это выделение достаточного для размещения величины участка динамической памяти.
Операция освобождения динамической памяти – это освобождение участка динамической памяти, выделенного ранее.
Сегмент данных – это непрерывная область памяти, в которой размещаются объявленные в программе переменные.
Функция выделения динамической памяти – это функция выделения памяти в соответствии со значениями параметров, возвращающая адрес начала выделенного участка памяти.
Функция освобождения динамической памяти – это функция освобождения динамической памяти, выделенной ранее.
Краткие итоги
- В ходе выполнения программ выделяются статическая и динамическая области памяти.
- Возможны три варианта работы с динамической памятью: указатель определяется как локальный объект автоматической или статической памяти, указатель является глобальным объектом для блока памяти.
- Доступ к участкам динамической памяти осуществляется через динамические переменные.
- Работа с динамической памятью начинается с выделения участка памяти, а завершается освобождением ранее выделенного участка.
- Выделение и освобождение динамической памяти выполняется с помощью операций или функций для работы с динамической памятью.