Malloc | это... Что такое Malloc? (original) (raw)
malloc
malloc (от англ. memory allocation, выделение памяти) и calloc (от англ. clear allocation, чистое выделение (памяти)) — функции выделения динамической памяти, входящие в стандартную библиотеку языка Си.
Содержание
- 1 Описание функций
- 2 Назначение
- 3 Параметры функций
- 4 Возвращаемое значение
- 5 Характерные ошибки при использовании
- 6 Примеры использования
- 7 См. также
- 8 Источники
Описание функций
#include <stdlib.h>
void *malloc (size_t size); void *calloc (size_t num, size_t size);
Назначение
malloc принимает в качестве аргумента размер выделяемой области в байтах; возвращает нетипизированный указатель (void*
) на область памяти заявленного размера или NULL в случае, если выделить память невозможно. Содержимое выделяемой области памяти не определено.
calloc принимает в качестве аргумента количество элементов и размер каждого элемента в байтах; возвращает нетипизированный указатель (void*
) на область памяти заявленного размера или NULL в случае, если выделить память невозможно. Значения элементов устанавливаются в ноль. malloc работает быстрее, чем calloc, в связи с отсутствием функции обнуления выделяемой памяти.
Параметры функций
malloc
- size — размер распределяемой области памяти
calloc
- num — количество распределяемых элементов
- size — размер каждого элемента
Возвращаемое значение
Функции возвращают нетипизированный (void*
) указатель на область памяти в случае успеха, либо NULL в противном случае.
Характерные ошибки при использовании
- Память остаётся «занятой», даже если ни один указатель в программе на неё не ссылается (для освобождения памяти используется функция free()). Накопление «потерянных» участков памяти приводит к постепенной деградации системы. Ошибки, связанные с неосвобождением занятых участков памяти, называются утечками памяти (англ. memory leaks).
- Если объём обрабатываемых данных больше, чем объём выделенной памяти, возможно повреждение других областей динамической памяти. Такие ошибки называются ошибками переполнения буфера (англ. buffer overflow).
- Если указатель на выделенную область памяти после освобождения продолжает использоваться, то при обращении к «уже не существующему» блоку динамической памяти может произойти исключение (англ. exception), сбой программы, повреждение других данных или не произойти ничего (в зависимости от типа операционной системы и используемого аппаратного обеспечения).
- Если для одной области памяти free() вызывается более чем один раз, то это может повредить данные самой библиотеки, содержащей malloc/free, и привести к непредсказуемому поведению в произвольные моменты времени.
- Неудачная организация программы, в которой выделяется и освобождается множество небольших объёмов памяти — возможна фрагментация свободной памяти («пунктир»), при которой свободной памяти в сумме остаётся много, но выделить большой кусок невозможно.
Точное поведение функций описано в стандарте ANSI C, на него же ссылается определение функции в стандарте POSIX.
Примеры использования
malloc
float dynamic_array = malloc(number_of_elements * sizeof(float)); if(!dynamic_array) { / обработка ошибки выделения памяти */ }
/* … работа с элементами массива … */
free(dynamic_array); dynamic_array = NULL;
calloc
float dynamic_array = calloc(number_of_elements, sizeof(float)); if(!dynamic_array) { / обработка ошибки выделения памяти */ }
/* … работа с элементами массива … */
free(dynamic_array); dynamic_array = NULL;
См. также
- Динамическая память
- Си
- NULL (Си)
- New (C++)
- stdlib
- POSIX
- ANSI C
- free()
- alloca
- Менеджер памяти
- Куча
- soap malloc
- soap destroy
Источники
- malloc (англ.). — Описание функции malloc в стандарте POSIX.
- calloc (англ.). — Описание функции calloc в стандарте POSIX.
Wikimedia Foundation.2010.