realloc

重新分配内存块。

语法

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

参数

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

size
新大小(字节)。

返回值

realloc 将返回指向重新分配的(并且可能已移动的)内存块的 void 指针。

如果没有足够可用的内存将块扩展到给定大小,则原始块将保持不变,并返回 NULL。

如果 size 为零,则释放由 memblock 指向的块;返回值为 NULL,而 memblock 仍指向已释放的块。

返回值将指向适当对齐任何类型的对象的存储的存储空间。 若要获取指向类型而非 void 的指针,请在返回值中使用类型转换。

备注

注意

尚未为实现 C17 行为而更新 realloc,因为新行为与 Windows 操作系统不兼容。

realloc 函数更改已分配内存块的大小。 memblock 参数指向内存块的开头。 如果 memblock 为 NULL,则 realloc 与 malloc 的行为相同,并分配一个 size 字节的新块。 如果 memblock 不为 NULL,则它应是指向以前调用 calloc、malloc 或 realloc 所返回的指针。

size 参数提供块的新大小(字节)。 块的内容不随其新旧大小而更改,尽管新块可以在不同的位置。 因为新块可以在新的内存位置,所以由 realloc 返回的指针并非一定是指向通过 memblock 参数传递的指针。 如果存在缓冲区增长,则 realloc 不会将新分配的内存清零。

如果内存分配失败或请求的内存量超过 _HEAP_MAXREQ,则 realloc 将 errno 设置为 ENOMEM。 有关此错误代码和其他错误代码的信息,请参阅 errno、_doserrno、_sys_errlist 和 _sys_nerr。

realloc 调用 malloc 以使用 C++ _set_new_mode 函数设置新的处理程序模式。 新的处理程序模式将指示 malloc 是否在失败时调用由 _set_new_handler 设置的新处理程序例程。 默认情况下,malloc 在失败时不调用新的处理程序例程来分配内存。 可以替代此默认行为,以便在 realloc 无法分配内存时,malloc 将以 new 运算符由于相同原因失败时的同一方法调用新的处理程序例程。 若要替代默认值,请在程序的早期调用:

_set_new_mode(1);

或链接到 NEWMODE.OBJ(请参阅链接选项)。

当应用程序与调试版的 C 运行时库链接时,realloc 将解析为 _realloc_dbg。 有关在调试过程中如何托管堆的详细信息,请参阅 CRT 调试堆。

realloc 被标记为 __declspec(noalias) 和 __declspec(restrict),也就是说确保该函数不能修改全局变量,并且指针返回不使用别名。 有关详细信息,请参阅 noalias 和 restrict。

默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态。

要求

例程 必需的标头
realloc <stdlib.h> 和 <malloc.h>

有关兼容性的详细信息,请参阅 兼容性。

示例

// crt_realloc.c
// This program allocates a block of memory for
// buffer and then uses _msize to display the size of that
// block. Next, it uses realloc to expand the amount of
// memory used by buffer and then calls _msize again to
// display the new amount of memory allocated to buffer.

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

int main( void )
{
   long *buffer, *oldbuffer;
   size_t size;

   if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )
      exit( 1 );

   size = _msize( buffer );
   printf_s( "Size of block after malloc of 1000 longs: %u\n", size );

   // Reallocate and show new size:
   oldbuffer = buffer;     // save pointer in case realloc fails
   if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))
        ==  NULL )
   {
      free( oldbuffer );  // free original block
      exit( 1 );
   }
   size = _msize( buffer );
   printf_s( "Size of block after realloc of 1000 more longs: %u\n",
            size );

   free( buffer );
   exit( 0 );
}
Size of block after malloc of 1000 longs: 4000
Size of block after realloc of 1000 more longs: 8000

另请参阅

内存分配
calloc
free
malloc