C++官网参考链接:https://cplusplus.com/reference/cstdlib/realloc/
函数
<cstdlib>
realloc
void* realloc (void* ptr, size_t size);
重新分配内存块
更改ptr所指向的内存块的大小。
函数可能将内存块移动到一个新的位置(其地址由函数返回)。
即使块被移动到一个新的位置,内存块的内容仍然保留到新和旧大小中较小的内存块中。如果新的size更大,则新分配的部分的值是不确定的。
如果ptr是空指针,该函数的行为类似于malloc,分配一个size个字节的新块,并返回指向其开始的指针。
C90(C++98)
否则,如果size为0,则释放之前在ptr分配的内存,就像调用了free一样,并返回空指针。
C99/C11(C++11)
如果size为0,则返回值取决于特定的库实现:它可能是空指针,也可能是不应该解引用的其他位置。
如果函数分配请求的内存块失败,将返回一个空指针,并且实参ptr所指向的内存块不会被释放(它仍然有效,且其内容不变)。
形参
ptr
指向先前用malloc,calloc或realloc分配的内存块的指针。
或者,它可以是一个空指针,在这种情况下分配一个新的块(就像调用malloc一样)。
size
内存块的新大小,以字节为单位。
size_t是无符号整型。
返回值
一个指向重新分配的内存块的指针,它可以是与ptr相同的,也可以是一个新的位置。
此指针的类型为void*,可以将其强制转换为所需的数据指针类型,以便可解引用。
C90(C++98)
空指针表示size为0(因此ptr被释放),或者函数没有分配存储空间(因此ptr指向的块没有被修改)。
C99/C11(C++11)
空指针表示函数分配存储失败,因此ptr指向的块没有被修改。
用例
/* realloc example: rememb-o-matic */
#include <stdio.h> /* printf, scanf, puts */
#include <stdlib.h> /* realloc, free, exit, NULL */
int main ()
{
int input,n;
int count = 0;
int* numbers = NULL;
int* more_numbers = NULL;
do {
printf ("Enter an integer value (0 to end): ");
scanf ("%d", &input);
count++;
more_numbers = (int*) realloc (numbers, count * sizeof(int));
if (more_numbers!=NULL) {
numbers=more_numbers;
numbers[count-1]=input;
}
else {
free (numbers);
puts ("Error (re)allocating memory");
exit (1);
}
} while (input!=0);
printf ("Numbers entered: ");
for (n=0;n<count;n++) printf ("%d ",numbers[n]);
free (numbers);
return 0;
}
程序提示用户输入数字,直到输入0字符为止。每次引入一个新值时,由数字指向的内存块的大小就增加一个int的大小。
数据竞争
只有ptr和返回指针引用的存储才会被修改。调用不会访问其他存储位置。
如果函数释放或重用由另一个分配或释放函数重用或释放的存储单元,则函数以这样的方式同步,即释放完全在下一次分配之前发生。
异常(C++)
无抛出保证:此函数从不抛出异常。