Поделиться через


malloc

Размещение блоков памяти

Синтаксис

void *malloc(
   size_t size
);

Параметры

size
Байты для размещения.

Возвращаемое значение

malloc возвращает указатель void на выделенное пространство или NULL в случае нехватки памяти. Чтобы вернуть указатель на тип, отличный от void, используйте приведение типов для возвращаемого значения. Пространство хранилища, на которое указывает возвращаемое значение, подходит для хранения любого типа объекта, имеющего требование выравнивания меньше или равное базовому выравниванию. (В Visual C++основное выравнивание — это выравнивание, необходимое для double8 байтов. В коде, предназначенном для 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

См. также

Распределение памяти
calloc
free
realloc
_aligned_malloc