函式
<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++)

無異常保證:此函式從不丟擲異常。

另見