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


_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, and _sys_nerr.

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

Заметки

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

Примечание

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

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

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

Требования

Функция

Обязательный заголовок

_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 );
}
  

Эквивалент в .NET Framework

Неприменимо. Для вызова стандартной функции C используйте PInvoke. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.

См. также

Ссылки

Выделение памяти

calloc

свободные

malloc

_msize

realloc