更改内存块的大小。
语法
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