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


_expand

Изменяет размер блока памяти.

Синтаксис

void *_expand(
   void *memblock,
   size_t size
);

Параметры

memblock
Указатель на ранее выделенный блок памяти.

size
Новый размер в байтах.

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

Функция _expand возвращает указатель на перераспределенный блок памяти. _expandВ отличие от reallocэтого, не удается переместить блок, чтобы изменить его размер. Таким образом, если доступно достаточно памяти для расширения блока, не перемещая его, memblock параметр _expand должен совпадать с возвращаемым значением.

При обнаружении ошибки во время работы функции _expand она возвращает значение NULL. Например, если функция _expand используется, чтобы сжать блок памяти, она может обнаружить повреждение в куче с малыми блоками или недопустимый указатель блока и вернуть значение NULL.

Если для расширения блока недостаточно памяти, функция возвращается NULL. Функция _expand никогда не возвращает блок, увеличенный до меньшего размера, чем было запрошено. Если происходит сбой, параметр errno указывает характер ошибки. Дополнительные сведения о , см. в errnoразделеerrno , _doserrno_sys_errlistи _sys_nerr.

Возвращаемое значение указывает на место хранения, подходящее для хранения любого типа объекта. Чтобы проверить новый размер элемента, используйте функцию _msize. Чтобы получить указатель на тип, отличный от void, используйте приведение типов для возвращаемого значения.

Замечания

Функция _expand изменяет размер блока ранее выделенного блока памяти, пытаясь увеличить или уменьшить блок без его перемещения в куче. Параметр memblock указывает на начало блока. Параметр size указывает новый размер блока в байтах. Содержимое блока в пределах наименьшего из нового и старого размеров остается неизменным. memblock не должен быть блоком, который был освобожден.

Примечание.

На 64-разрядных платформах функция _expand может не изменить блок, если новый размер меньше, чем текущий размер; в частности, если размер блока был меньше 16 КБ и, следовательно, блок был размещен в куче низкой фрагментации, функция _expand оставляет блок без изменений и возвращает memblock.

Если приложение связано с отладочной версией библиотек времени выполнения C, _expand разрешается в _expand_dbg. Дополнительные сведения о том, как куча управляется во время отладки, см. в разделе "Отладочная куча CRT".

Эта функция проверяет свои параметры. Если memblock это указатель null, эта функция вызывает недопустимый обработчик параметров, как описано в разделе "Проверка параметров". Если выполнение может быть продолжено, для errno задается значение EINVAL , и функция возвращает значение NULL. Если size значение больше _HEAP_MAXREQ, errno задано значение ENOMEM, а функция возвращается NULL.

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.

Требования

Function Обязательный заголовок
_expand <malloc.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

// crt_expand.c

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

int main( void )
{
   char *bufchar;
   printf( "Allocate a 512 element buffer\n" );
   if( (bufchar = (char *)calloc( 512, sizeof( char ) )) == NULL )
      exit( 1 );
   printf( "Allocated %d bytes at %Fp\n",
         _msize( bufchar ), (void *)bufchar );
   if( (bufchar = (char *)_expand( bufchar, 1024 )) == NULL )
      printf( "Can't expand" );
   else
      printf( "Expanded block to %d bytes at %Fp\n",
            _msize( bufchar ), (void *)bufchar );
   // Free memory
   free( bufchar );
   exit( 0 );
}
Allocate a 512 element buffer
Allocated 512 bytes at 002C12BC
Expanded block to 1024 bytes at 002C12BC

См. также

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