_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. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.