realloc

重新分配内存块。

语法

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

参数

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

size
新大小(字节)。

返回值

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

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

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

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

备注

注意

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

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

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

如果内存分配失败或请求的内存量超过 _HEAP_MAXREQ,则 reallocerrno 设置为 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),也就是说确保该函数不能修改全局变量,并且指针返回不使用别名。 有关详细信息,请参阅 noaliasrestrict

默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 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