_expand

更改内存块的大小。

语法

void *_expand(
   void *memblock,
   size_t size
);

参数

memblock
指向之前已分配内存块的指针。

size
新大小(字节)。

返回值

_expand 将返回指向重新分配的内存块的 void 指针。 _expandrealloc 不同,它无法移动块来更改其大小。 因此,如果有足够的内存可用于在不移动块的情况下扩展块,_expandmemblock 参数与返回值相同。

_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_MAXREQerrno 设置为 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

另请参阅

内存分配
calloc
free
malloc
_msize
realloc