realloc
函数 <cstdlib>
void* realloc (void* ptr, size_t size);
重新分配内存块
修改ptr指向的内存块的大小。
函数可以将内存块移动到一个新位置(其地址由函数返回)。
原指针指向内存块被自动释放,不需要调用
free函数.
内存块被移动到新的位置,如果新的size小于原内存块size,可能会导致数据丢失。如果新的size更大,则新分配的部分的值是不确定的。
如果ptr是空指针,则该函数的行为与
malloc类似,即分配一个size字节的新块并返回指向其开头的指针。
C90 (C++98) |
如果size为0,则释放之前在ptr上分配的内存,就像执行了free调用一样,并返回一个空指针。 |
C99/C11 (C++11) |
如果size为0,则返回值取决于特定的库实现:它可能是空指针,也可能是不能解引用的其他位置。 |
如果函数未能分配请求的内存块,则返回一个空指针,并且参数ptr指向的内存块没有被释放(它仍然有效,内容没有改变)。
☲ 参数
ptr
指向先前用
calloc、
malloc或
realloc分配的内存块的指针。
或者,这可以是一个空指针,在这种情况下分配一个新的块(就像调用了malloc一样)。
size
内存块的新大小,以字节为单位.
size_t是一个无符号整型.
☉ 返回值
一个指向重新分配的内存块的指针,它可以与ptr相同,也可以是一个新位置。
该指针的类型为void*,可以强制转换为所需的数据指针类型以实现解引用。
C90 (C++98) |
空指针表示大小为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;
} |
程序提示用户输入数字,直到输入零字符为止。每次引入一个新值时,由数字指向的内存块就增加一个int类型的大小.
↭ 数据竞争
只有ptr和返回的指针引用的存储被修改。调用不会访问其他存储位置。
如果函数释放或重用了被另一个分配或释放函数重用或释放的存储单元,
那么函数将以这样一种方式同步:即释放完成才可以进行下一次分配。
❆ 异常(c++)
无抛出保证:此函数从不抛出异常。
🍄 另请参阅