_expand
更改内存块的大小。
语法
void *_expand(
void *memblock,
size_t size
);
参数
memblock
指向之前已分配内存块的指针。
size
新大小(字节)。
返回值
_expand
将返回指向重新分配的内存块的 void 指针。 _expand
与 realloc
不同,它无法移动块来更改其大小。 因此,如果有足够的内存可用于在不移动块的情况下扩展块,_expand
的 memblock
参数与返回值相同。
_expand
在其操作过程中检测到错误时返回 NULL
。 例如,如果 _expand
用于收缩内存块,它可能会在小块堆或无效的块指针中检测到损坏,并返回 NULL
。
如果没有足够的内存可用于在不移动块的情况下扩展块,函数会返回 NULL
。 _expand
从不返回扩展到小于请求大小的块。 如果出现失败,则 errno
指示失败原因。 有关 errno
的详细信息,请参阅 errno
、_doserrno
、_sys_errlist
和 _sys_nerr
。
返回值将指向适当对齐任何类型的对象的存储的存储空间。 若要检查项目的新大小,请使用 _msize
。 若要获取指向类型而非 void
的指针,请在返回值中使用类型转换。
注解
_expand
函数通过尝试扩展或收缩块且不在堆中移动其位置的情况下,更改以前分配的内存块的大小。 memblock
参数指向块的开头。 size
参数指定块的新大小(以字节为单位)。 根据新大小和旧大小中的较短者,块内容保持不变。 memblock
不应是已释放的块。
注意
在 64 位平台上,如果块的新大小小于当前大小,则 _expand
不能对块进行收缩;尤其是,如果块的大小小于 16K 并在低碎片堆中进行分配,则 _expand
保持块不变并返回 memblock
。
当应用程序与调试版的 C 运行时库链接时,_expand
将解析为 _expand_dbg
。 若要详细了解如何在调试过程中托管堆,请参阅 CRT 调试堆。
此函数验证其参数。 如果 memblock
为空指针,此函数会调用无效的参数处理程序,如参数验证中所述。 如果允许继续执行,则将 errno
设置为 EINVAL
并且该函数返回 NULL
中所述。 如果 size
大于 _HEAP_MAXREQ
,errno
设置为 ENOMEM
,并且函数返回 NULL
。
默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态。
要求
函数 | 必需的标头 |
---|---|
_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