logo
Подбельский Фомин_Программирование на языке СИ_

Управление динамической памятью.

Управление динамической памятью. Как мы уже упоминали, в библиотеке языка Си есть функции выделения и освобождения динамической памяти. Благодаря наличию таких функций отпадает необходимость заранее резервировать для программы всю доступную память, что оказывается полезным в ситуациях, когда требуемый объем памяти заранее не известен или зависит от конкретного применения программы.

Работа с динамической памятью (выделение памяти, изменение размера ранее занятого участка, освобождение памяти) производится с помощью функций malloc( ), calloc( ), realloc( ), free( ), описанных в §4.2. Использование функций malloc( ), calloc( ), free( ) выше продемонстрировано на многочисленных примерах. Остановимся на особенностях функции realloc( ).

Функция realloc( ) может быть использована для изменения размера ранее занятого участка памяти. При этом адрес начала участка может измениться. Описание (прототип) функции realloc( ):

void *realloc ( void *oldptr, unsigned int new_size);

где oldptr - указатель на участок памяти, ранее выделенный с помощью функции malloc( ) или calloc( ); new_size - размер требуемой памяти.

Стандарт языка Си [5] рекомендует для устранения влияния "перемещений" выделяемого с помощью realloc( ) участка памяти следующим образом использовать функцию realloc( ):

Например, если oldptr указывал на часть связного списка и для этой части функцией realloc() нужно выделить новый участок памяти, то старое значение oldptr может оказаться неверным (не будет адресовать новое продолжение списка). Применение описанной схемы (т.е. явное присваивание oldptr нового адреса) позволит избежать возможных ошибок и сохранить связность списка.

Необходимо отметить, что все функции, за исключением функции free(), возвращают значение указателя, равное NULL, если для выделения запрошенного участка памяти не хватает.