- •Алфавит языка
- •Идентификаторы
- •Структура программы
- •Переменные
- •Константы
- •Типы данных
- •Выражения и операции
- •Арифметические операции.
- •Выражения и операции
- •Операции отношения.
- •Логические операции.
- •Структура программы
- •Форматированный ввод с клавиатуры.
- •Scanf(“форматная_строка”, список_аргументов);
- •Форматированный вывод на экран.
- •Printf(“форматная_строка”, список_аргументов);
- •Операция присваивания.
- •Условный оператор if
- •If (выражение) оператор1; else оператор2;
- •If (выражение) оператор;
- •Оператор выбора (переключатель)
- •Операторы циклов
- •Цикл с предусловием while
- •Операторы циклов
- •Цикл с постусловием do-while
- •Операторы циклов
- •Цикл с параметром for
- •Массивы
- •Массивы
- •Одномерные массивы
- •Массивы
- •Массивы
- •Двумерные массивы
- •Массивы
- •Двумерные массивы
- •Операции над элементами двумерного массива
- •Функции
- •Функции
- •Ввод – вывод строк
- •Ввод – вывод строк
- •Структуры
- •Структуры
- •Функции работы с файлами
- •Указатели
- •Операции над указателями
- •Динамическое выделение памяти
Динамическое выделение памяти
Статическими называются такие величины, память под которые выделяется во время компиляции и сохраняется в течение всей работы программы.
Существует и другой способ выделения памяти под данные, который называется динамическим. В этом случае память под величины отводится во время выполнения программы. Такие величины будем называть динамическими.
Раздел оперативной памяти, распределяемый статически, называется статической памятью; динамически распределяемый раздел памяти называется динамической памятью.
Динамическая память - это область памяти, выделенная для нужд программы в процессе работы программы (а не заранее).
Использование динамических величин предоставляет программисту ряд дополнительных возможностей. Во-первых, подключение динамической памяти позволяет увеличить объем обрабатываемых данных. Во-вторых, если потребность в каких-то данных отпала до окончания программы, то занятую ими память можно освободить для другой информации. В-третьих, использование динамической памяти позволяет создавать структуры данных переменного размера.
Динамическая переменная хранится в некоторой области ОП, обращение к которой производится через переменную-указатель. Указатель содержит адрес поля в динамической памяти, хранящего величину определенного типа. Сам указатель располагается в статической памяти.
Работа с динамическими данными замедляет выполнение программы, поскольку доступ к величине происходит в два шага: сначала ищется указатель, затем по нему — величина: выигрыш в памяти компенсируется проигрышем во времени.
Основными двумя действиями над динамической памятью являются: выделение и освобождение. В языке С функции для осуществления этих действий описаны в библиотеке stdlib.h.
Функция выделения блока памяти:
void * malloc(size);
В параметре size (целое незнаковое число) функции передается размер блока памяти в байтах, который необходимо выделить. Функция возвращает значение не типизированного указателя на выделенный блок памяти, или значение NULL, если блок памяти заданного объема выделить не удалось (нет места в памяти).
Так как все функции, работающие с динамической памятью, возвращают не типизированные указатели, то для присвоения их значений типизированным указателям необходимо производить операцию приведения типа:
int *v;
v=(int*)malloc(sizeof(int));
Функция выделения блока памяти под массив:
void * calloc(num, size);
В первом параметре num (целое незнаковое число) передается число элементов в массиве. Во втором параметре size (целое незнаковое число) передается размер одного элемента массива. Функция возвращает значение не типизированного указателя на выделенный блок памяти, или значение NULL, если блок памяти заданного объема выделить не удалось.
Например, фрагмент программы для выделения динамической памяти под целочисленный массив из 20 элементов:
int *array = (int *)calloc(20,sizeof(int));
Функции calloc и malloc взаимозаменяемы.
Функция освобождения динамической памяти:
void free(void *block);
В параметре block (не типизированный указатель) в функцию передается указатель на выделенный ранее блок памяти. Функция не возвращает никакого значения.
Например, освобождение блока памяти,: free(array);
