НАЗВАНИЕ
calloc, malloc, free, realloc − Выделение и освобождение динамической памяти
СИНТАКСИС
#include <stdlib.h>
void
*calloc(size_t nmemb, size_t
size);
void *malloc(size_t size);
void free(void *ptr);
void *realloc(void *ptr, size_t
size);
ОПИСАНИЕ
calloc() выделяет память для массива из nmemb элементов по size байт каждый, и возвращает указатель на выделенную память. Выделенная память обнуляется.
malloc() выделяет size байт и возвращает указатель на выделенную память. Выделенная память не инициализируется.
free() освобождает область памяти, на которую указывает ptr, которая быть выделена ранее посредством malloc(), calloc() или realloc(). Иначе, если free(ptr) был уже вызван ранее, результат операции не определен. Если ptr равен NULL, то ничего не происходит.
realloc() изменяет размер блока динамической памяти, на который указывает ptr. Новый размер блока будет равен size байт. Его содержимое останется неизменным в промежутке вплоть до прежнего или нового размера, смотря что меньше; добавленная память не инициализируется. Если ptr равен NULL, то результат вызова эквивалентен malloc(size); если size равен нулю, то результат вызова эквивалентен free(ptr). Кроме случая, когда ptr равен NULL, он должен указывать на память, выделенную ранее посредством malloc(), calloc() или realloc().
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
calloc() и malloc() возвращают указатели на выделенную память, выровненную так, что их можно использовать для переменных любого типа. При неудаче выделения возвращается NULL.
free ничего не возвращает.
realloc() возвращает указатель на новый участок памяти, выровненный так, что его можно использовать для переменных любого типа, причем этот новый указатель может отличаться от ptr. Если запрос выполнить не удается или новый размер равен нулю, возвращается NULL. Если вызов realloc() завершился неудачно, то старый блок памяти остается нетронутым: он не освобождается и не перемещается.
СООТВЕТСТВИЕ СТАНДАРТАМ
ANSI-C
СМОТРИ ТАКЖЕ
ЗАМЕЧАНИЯ
Стандарт Unix98 требует, чтобы malloc(), calloc() и realloc() устанавливали переменную errno в значение ENOMEM в случае неуспешного выделения памяти. Glibc полагает, что это условие выполняется (и для glibc-версии этих функций это так); если же вы используете реализацию, не устанавливающую errno, то некоторые функции библиотеки могут завершаться ошибочно, не зная причины неудачи.
Сбои внутри malloc(), free() или realloc() в большинстве случаев вызваны нарушениями структуры хипа, такими как запись за границы выделенного участка или повторное освобождение памяти по одному и тому же указателю.
Последние версии Linux libc (новее, чем 5.4.23) и GNU libc (2.x) включают в себя реализацию функций управления памятью, настраиваемую через переменные окружения. Когда установлена MALLOC_CHECK_, используется специальная (и менее эффективная) реализация, которая разработана с целью быть более устойчивой к небольшим ошибкам, таким как двойной вызов free() с одинаковым аргументом, или переполнениями на один байт. Это, тем не менее, обеспечивает защиту не от всех ошибок, которые могут привести к утечкам памяти. Если MALLOC_CHECK_ установлена в 0, все замеченные нарушения структуры хипа игнорируются; если установлена в 1, диагностика печатается на stderr; если установлена в 2, то немедленно вызывается abort(). Это может быть полезным, так как иначе реальный сбой мог бы произойти много позже, и истинную его причину было бы в этом случае очень трудно найти.
ПЕРЕВОД
Перевод
с
английского
(C) 2000 Дмитрий
Морожников
(dm [AT] simplex.ru, 2:5070/141.3)