malloc
Размещение блоков памяти
Синтаксис
void *malloc(
size_t size
);
Параметры
size
Байты для размещения.
Возвращаемое значение
malloc
возвращает указатель void на выделенное пространство или NULL
в случае нехватки памяти. Чтобы вернуть указатель на тип, отличный от void
, используйте приведение типов для возвращаемого значения. Пространство хранилища, на которое указывает возвращаемое значение, подходит для хранения любого типа объекта, имеющего требование выравнивания меньше или равное базовому выравниванию. (В Visual C++основное выравнивание — это выравнивание, необходимое для double
8 байтов. В коде, предназначенном для 64-разрядных платформ, это 16 байт.) Используется _aligned_malloc
для выделения хранилища для объектов с большим требованием выравнивания, например типов __m128
SSE и __m256
типов, объявленных с помощью __declspec(align( n ))
более n
8. Если значение size
равно 0, функция malloc
выделяет элемент нулевой длины в куче и возвращает допустимый указатель на этот элемент. Всегда проверяйте возвращаемое функцией malloc
значение, даже если объем запрошенной памяти мал.
Замечания
Функция malloc
выделяет блок памяти размером не менее size
байтов. Размер блока может превышать size
байтов из-за дополнительных затрат места на хранение информации о выравнивании и обслуживании.
Функция malloc
задает для параметра errno
в значение ENOMEM
, если выделение памяти завершается сбоем или количество запрошенной памяти превышает _HEAP_MAXREQ
. Сведения об этом и других кодах ошибок см. в разделе errno
, _doserrno
и _sys_errlist
_sys_nerr
.
Код запуска использует функцию malloc
для выделения пространства для переменных _environ
, envp
и argv
. Функцию malloc
также вызывают следующие функции и их аналоги для расширенных символов.
Функция C++ _set_new_mode
задает новый режим обработчика для malloc
. Новый режим обработки указывает, должна ли функция malloc
при сбое вызывать новую подпрограмму обработчика, заданную функцией _set_new_handler
. По умолчанию malloc
не вызывает новую подпрограмму обработчика при сбое выделения памяти. Можно переопределить это поведение по умолчанию, чтобы в случае сбоя предоставления памяти функцией malloc
функция malloc
вызывала новую подпрограмму обработчика таким же образом, как это делает оператор new
при сбое по той же причине. Чтобы переопределить значение по умолчанию, вызовите _set_new_mode(1)
в начале программы или свяжите с ним (см. раздел "Параметры ссылки NEWMODE.OBJ
").
Если приложение связано с отладочной версией библиотек времени выполнения C, malloc
разрешается в _malloc_dbg
. Дополнительные сведения о том, как куча управляется во время отладки, см. в сведениях об отладочной куче CRT.
malloc
помечается __declspec(noalias)
и __declspec(restrict)
. Эти атрибуты означают, что функция гарантированно не изменяет глобальные переменные, и что возвращенный указатель не является псевдонимом. Дополнительные сведения см. в разделах noalias
и restrict
.
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.
Требования
Маршрут | Обязательный заголовок |
---|---|
malloc |
<stdlib.h> и <malloc.h> . |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Библиотеки
Все версии библиотек времени выполнения языка C.
Пример
// crt_malloc.c
// This program allocates memory with
// malloc, then frees the memory with free.
#include <stdlib.h> // For _MAX_PATH definition
#include <stdio.h>
#include <malloc.h>
int main( void )
{
char *string;
// Allocate space for a path name
string = malloc( _MAX_PATH );
// In a C++ file, explicitly cast malloc's return. For example,
// string = (char *)malloc( _MAX_PATH );
if( string == NULL )
printf( "Insufficient memory available\n" );
else
{
printf( "Memory space allocated for path name\n" );
free( string );
printf( "Memory freed\n" );
}
}
Memory space allocated for path name
Memory freed