Введение
Функция malloc — это функция стандартной библиотеки языка программирования Си, которая выполняет выделение динамической памяти.
В случаях, когда не известно заранее, сколько памяти потребуется программе для решения своих задач, используется механизм динамического выделения памяти. Возможно, для этих целей выделять память в куче, но этот метод имеет следующие недостатки:
- Очистка памяти должна выполняться вручную.
- Эта операция очень недешёвая.
Функция malloc
Чтобы выделить память, в языке Си есть специальная функция malloc(), которая позволяет осуществлять процедуру выделен6ия памяти, когда это необходимо. Она является функцией стандартной библиотеки Си и записывается следующим образом:
voìd* malloc(sìze_t); //выделяет память
Здесь:
- sìze_t определяет объём выделенного участка памяти в байтах.
- voìd* является обобщающим типом указателя, то есть не привязывается ни к одному какому-то типу.
Приведём пример использования этой функции, в случае предоставления памяти для десяти компонентов типа double:
Рисунок 1. Пример использования функции. Автор24 — интернет-биржа студенческих работ
При выполнении обращения к функции malloc() осуществляется вычисление требуемой зоны памяти, где будут сохранены десять компонентов типа double. Эту задачу решает функция sizeof(), возвращающая количество байтов, которые потребуются, чтобы сохранить один компонент типа double. Далее полученное число надо умножить на десять, что и станет необходимым итоговым объёмом памяти для десяти компонентов. Если же по различным факторам нет возможности выделения требуемого размера памяти, то функция malloc() делает возврат нулевого значения, то есть NULL. Эта константа имеет определение в ряде библиотек. Когда функция malloc() выполняет возврат указателя на требуемую зону памяти и он не нулевой, то начинается выполнение цикла, в котором прописываются величины всех компонентов. Для упрощения процедуры задания параметров в С++ существует такой термин как ссылка. Она по сути является вторым именем (псевдонимом), которое программы имеют возможность применять для работы с переменной. Характерной чертой применения ссылок является то, что их нужно при объявлении сразу инициализировать. Например, так:
ìnt var;
ìnt &var2 = var;
В этом примере объявляется ссылка по имени var2, а её инициализацию выполняет переменная var. Но это означает, что у переменной var есть псевдоним, обозначаемый как var2. И через него имеется возможность менять значения переменной var. Достоинством применения ссылок по отношению к указателям является их обязательная инициализация. Это значит программист может быть в полной уверенности, что переменная var2 взаимодействует с предназначенной ей зоной памяти, а не с произвольной, что бывает в случае применения указателя. Ссылка также отличается от указателя тем, что её достаточно инициализировать единожды, когда её задают. Мало того, если ссылку инициализировать второй раз, то это вызовет ошибку при компиляции программы. Это обеспечивает надёжность применения ссылок, правда понижает возможности их гибкого использования. Как правило, ссылки применяют как аргументы функций, чтобы изменить передаваемые внутри функции переменные. Приведём конкретный пример использования этой функции:
Рисунок 2. Пример использования функции. Автор24 — интернет-биржа студенческих работ
В этом примере функция swap() применяет пару аргументов, которые являются ссылками на пару переменных. Путём задания имён ссылок a и b, выполняется управление переменными arg1 и arg2, которые задаются в главной функции main() и передаются в качестве параметров функции swap(). Достоинством функции swap(), применяющей не указатели на переменные, а ссылки, является гарантированный приём функцией в качестве аргумента соответствующих типов переменных, а не какие-то иные данные, и ссылки всегда пройдут корректную инициализацию перед их применением. Эти моменты контролируются программой компиляции при формировании объектного кода из текстовой версии программы. При обнаружении неправильных ссылок будет выдано сообщение об ошибке. При работе со ссылками, в отличие от указателей, нет возможности выполнения следующих операций:
- Не допускается получение адреса ссылки путём применения оператора адреса С++.
- Запрещается присвоение указателя ссылке.
- Не допускается сравнение значения ссылок путём применения оператора сравнения С++.