Слайд 3
Динамическое выделение памяти
Что это значит?
Это значит то, что
при динамическом выделении памяти, память резервируется не на этапе
компиляции, а на этапе выполнения программы. И это дает нам возможность выделять память более эффективно, в основном это касается массивов. С динамическим выделением память, нам нет необходимости заранее задавать размер массива, тем более, что не всегда известно, какой размер должен быть у массива.
Слайд 4
Динамическое выделение памяти
Очень часто возникают задачи
обработки массивов данных, размерность которых заранее неизвестна. В этом
случае возможно использование одного из двух подходов:
выделение памяти под статический массив, содержащий максимально возможное число элементов, однако в этом случае память расходуется не рационально;
динамическое выделение памяти для хранение массива данных.
Слайд 5
Динамическое выделение памяти
Для динамического выделение памяти необходимо подключить
следующие библиотеки:
stdlib.h
malloc.h
Для динамического выделения памяти используются функции:
malloc
calloc
realloc
Далее мы рассмотрим каждую функцию
подробнее.
Слайд 6
Функция malloc()
void * malloc( size_t sizemem );
Функция malloc выделяет блок памяти,
размером sizemem байт, и
возвращает указатель на
начало блока.
Возвращаемое значение:
Указатель на выделенный блок памяти. Тип
данных на
который ссылается указатель всегда void*, поэтому это тип
данных может быть приведен к желаемому типу данных.
Если функции не удалось выделить требуемый блок
памяти, возвращается нулевой указатель.
Слайд 7
Функция realloc()
void * realloc( void * ptrmem, size_t size);
Функция
realloc выполняет перераспределение блоков памяти.
Размер блока памяти, на который
ссылается параметр ptrmem изменяется на size байтов. Блок памяти может уменьшаться или увеличиваться в размере.
Возвращаемое значение:
Указатель на перераспределенный блок памяти, который может быть либо таким же, как аргумент ptrmem или ссылаться на новое место.
Тип данных возвращаемого значения всегда void*, который может быть приведен к любому другому.
Если функции не удалось выделить требуемый блок памяти, возвращается нулевой указатель, и блок памяти, на который указывает аргумент ptrmem остается неизменным.
Слайд 8
Функция calloc()
void * calloc(size_t number, size_t size);
Функция calloc выделяет
блок памяти для массива размером — num элементов, каждый
из которых занимает size байт, и инициализирует все свои биты в нулями.
В результате выделяется блок памяти размером number * size байт, причём весь блок заполнен нулями.
Возвращаемое значение:
Указатель на выделенный блок памяти. Тип данных на который ссылается указатель всегда void*, поэтому это тип данных может быть приведен к желаемому типом данных.
Если функции не удалось выделить требуемый блок памяти, возвращается нулевой указатель.
Слайд 9
Функция free()
void free(void * ptrmem);
Функция free освобождает место в
памяти. Блок памяти, ранее выделенный с помощью вызова malloc,
calloc или realloc освобождается. То есть освобожденная память может дальше использоваться программами или ОС.
Обратите внимание, что эта функция оставляет значение ptrmem неизменным, следовательно, он по-прежнему указывает на тот же блок памяти, а не на нулевой указатель.
Возвращаемое значение:
Функция не имеет возвращаемое значение
Слайд 10
Пример malloc()
#include
#include
#include
#include
int main() {
int *a; // указатель на массив
int i, n;
setlocale(LC_ALL,"rus");
printf("Введите размер массива: ");
scanf("%d", &n);
a = (int*)malloc(n * sizeof(int)); // Выделение памяти
for (i = 0; i printf("a[%d] = ", i);
scanf("%d", &a[i]);
}
for (i = 0; i printf("%d ", a[i]);
free(a);
return 0;
}
Слайд 12
Пример calloc()
#include
#include
#include
#include
int main() {
int *a; // указатель на массив
int i, n;
setlocale(LC_ALL,"rus");
printf("Введите размер массива: ");
scanf("%d", &n);
a = (int*)calloc(n, sizeof(int)); // Выделение памяти
for (i = 0; i printf("a[%d] = ", i);
scanf("%d", &a[i]);
}
for (i = 0; i printf("%d ", a[i]);
free(a);
return 0;
}