Динамическая память в СИ
Весь объем памяти можно условно разделить на:
1. системная область, это та память которую занимает операционная система вместе с сервисами и драйверами.
2. пользовательская область, это та память которая используется хранения программ(и их данных) запущенных
пользователем.
3. свободная память, а это вся остальная память.
Динамическая память – это область памяти которая была выделена во время работы программы, а не во время ее создания. Есть 2 основных действия которые можно делать с динамической памятью: выделять ее и освобождать.
В СИ функции для осуществления этих действия описаны в библиотеке stdlib.h.
Далее будет приведено описание функций и примеры на языке си для работы с динамической памятью.
void * malloc(size_t size); - функция для выделения size байт динамической памяти
Далее пример в котором выделяется память под массив из 10 чисел типа int:
int *m = (int *)malloc(10*sizeof(int));
void * calloc(size_t num, size_t size); - а эта функция сделана специально для выделения памяти под массив(хотя ей можно выделять память и не только под массив), она плюс ко всему при выделении памяти еще заполняет ее нулями.
а теперь повторим предыдущий пример выделения памяти, только уже используя функцию calloc:
int *m = (int *)calloc(10,sizeof(int));
void * realloc(void *memblock, size_t size); - функция служащая для изменения размера блока ранее выделенной динамической памяти.
Например, увеличение целочисленного массива до 30-ти элементов:
m = (int *)realloc(m,30*sizeof(int));
void free(void *memblock); - функция для освобождения ранее выделенной области динамической памяти.
Например, освобождение блока памяти, выделенного под массив:
free(m);
Так же кроме описанных функций с динамической памятью в СИ(выделение и освобождение) часто используются некоторые функции, сейчас мы их рассмотрим.
void * memcpy(void * restrict targetbuf,const void * restrict sourcebuf,size_t num); - функция служит для копирования size_t байт памяти из sourcebuf в targetbuf.
void * memmove(void *targetbuf,const void *sourcebuf,size_t num); - а эта функция служит для перемещения size_t байт содержимого блока памяти из sourcebuf в targetbuf .
int memcmp(const void *buff1,const void *buff2,size_t num); - функция для сравнения двух блоков памяти, если они равны то функция вернет 0.
void * memset(void *buff, int c, size_t num); - функция для заполнения какими-то данными блока динамической памяти.
Примеры решения задач на динамическую память в СИ.