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