Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Изменяет размер блока памяти.
Синтаксис
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