函数
<cstdlib>

realloc

void* realloc (void* ptr, size_t size);
重新分配内存块
更改由 ptr 指向的内存块的大小。

该函数可能会将内存块移动到一个新位置(其地址由函数返回)。

内存块的内容会保留到新旧大小中较小者的那部分,即使内存块被移动到新位置。如果新的 size 更大,则新分配部分的值是未确定的。

如果 ptr 是一个空指针,该函数的行为就像 malloc 一样,分配一个大小为 size 字节的新块,并返回一个指向其起始位置的指针。

否则,如果 size 为零,先前在 ptr 处分配的内存将被释放,如同调用了 free 一样,并返回一个空指针
如果 size 为零,返回值取决于具体的库实现:它可能是一个空指针,也可能是某个不应被解引用的其他位置。

如果函数未能分配所请求的内存块,将返回一个空指针,并且由参数 ptr 指向的内存块不会被释放(它仍然有效,并且其内容保持不变)。

参数

ptr
指向先前用 malloccallocrealloc 分配的内存块的指针。
或者,这也可以是一个空指针,在这种情况下会分配一个新块(如同调用了 malloc)。
size
内存块的新大小,以字节为单位。
size_t 是一个无符号整数类型。

返回值

指向重新分配的内存块的指针,该指针可能与 ptr 相同,也可能是一个新位置。
此指针的类型是 void*,可以被强制转换为所需的数据指针类型以便进行解引用。
空指针表示 size 为零(因此 ptr 被释放),或者函数未能分配存储空间(因此 ptr 指向的块未被修改)。
空指针表示函数未能分配存储空间,因此 ptr 指向的块未被修改。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/* 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;
}

该程序提示用户输入数字,直到输入一个零字符为止。每当输入一个新值时,由 numbers 指向的内存块就会增加一个 int 的大小。

数据竞争

只有 ptr 和返回的指针所引用的存储空间会被修改。调用不会访问其他存储位置。
如果该函数释放或重用了一个被另一个分配或释放函数重用或释放的存储单元,这些函数会以某种方式同步,使得释放操作完全在下一次分配之前发生。

异常 (C++)

无异常保证:此函数从不抛出异常。

另见