MALLOC(3C) MALLOC(3C) НАЗВАНИЕ malloc, free, realloc, calloc - управление памятью СИНТАКСИС |char *malloc (size) |unsigned size; | |void free (ptr) |char *ptr; | |char *realloc (ptr, size) |char *ptr; |unsigned size; | |char *calloc (nelem, elsize) |unsigned nelem, elsize; ОПИСАНИЕ Функции malloc и free предоставляют простой универсаль- ный механизм выделения и освобождения памяти. Функция malloc возвращает указатель на блок памяти размером не менее size байт, который можно использовать в произ- вольных целях. Аргументом функции free является указатель на блок па- мяти, предварительно выделенный с помощью функции malloc; после выполнения free эта часть памяти может быть выделена вновь, но ее содержимое теряется. В случае выхода за границы блока, выделенного функцией malloc, а также при вызове функции free с аргументом, не являвшимся результатом malloc, эффект будет непред- сказуемым. Функция malloc выделяет память из первого достаточно большого непрерывного блока свободной памяти, просмат- ривая все блоки по циклу, начиная с последнего выделен- ного или освобожденного. Попутно смежные свободные бло- ки объединяются в один больший свободный блок. Если не нашлось подходящего блока, то вызывается sbrk [см. brk(2)], в результате чего сдвигается верхняя граница сегмента данных программы. Функция realloc изменяет размер блока, на который ука- зывает аргумент ptr, до величины в size байт и возвра- щает указатель на (возможно перемещенный) блок. Часть содержимого блока до наименьшего из нового и старого размеров не изменяется. Если блок размером size байт не удается разместить на прежнем месте, то вызывается malloc для выделения блока нужного размера, после чего данные из старого блока перемещаются на новое место. Аргумент ptr функции realloc может указывать и на блок, освобожденный после последнего обращения к функциям malloc, realloc или calloc. Зная стратегию выделения памяти, последовательные вызовы функций malloc, free и realloc можно использовать для уплотнения памяти. Функция calloc выделяет пространство для массива из ne- lem элементов, каждый размером elsize байт, и заполняет массив нулями. Границы выделяемых блоков памяти располагаются так, чтобы обеспечить (быть может после преобразования типов результирующих указателей) хранение произвольных объек- тов. СМ. ТАКЖЕ brk(2), malloc(3X). ДИАГНОСТИКА Функции malloc, realloc и calloc возвращают пустой ука- затель NULL, если нет достаточного количества памяти или если обнаруживается нарушение структуры блоков (обычная причина такого нарушения - запись в память вне выделенных границ). В подобной ситуации не гарантирует- ся сохранение содержимого блока, на который указывает аргумент ptr. ПРИМЕЧАНИЯ Когда захвачено много блоков памяти, время поиска сво- бодного блока увеличивается. Если программа захватывает память, но не освобождает ее, то каждое последующее ус пешное выделение памяти происходит медленнее. Чтобы этого избежать, можно использовать более гибкую реали- зацию, см. malloc(3X).