_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