realloc
定义于头文件 <stdlib.h>
|
||
void *realloc( void *ptr, size_t new_size ); |
||
重新分配给定的内存区域。它必须是之前为 malloc() 、 calloc() 或 realloc()
所分配,并且仍未被 free 或 realloc
的调用所释放。否则,结果未定义。
重新分配按以下二者之一执行:
a) 可能的话,扩张或收缩
ptr
所指向的已存在内存。内容在新旧大小中的较小者范围内保持不变。若扩张范围,则数组新增部分的内容是未定义的。 b) 分配一个大小为
new_size
字节的新内存块,并复制大小等于新旧大小中较小者的内存区域,然后释放旧内存块。若无足够内存,则不释放旧内存块,并返回空指针。
若 ptr
是 NULL ,则行为与调用 malloc(new_size
) 相同。
若 new_size
为零,则行为是实现定义的(可返回空指针,此情况下可能或可能不释放旧内存,或返回不会用于访问存储的非空指针)。
先前令 free 或 realloc 归还一块内存区域的调用,同步于任何分配函数的调用,包括分配相同或部分相同内存区域的 |
(C11 起) |
参数
ptr | - | 指向需要重新分配的内存区域的指针 |
new_size | - | 数组的新大小(字节数) |
返回值
成功时,返回指向新分配内存的指针。返回的指针必须用 free() 或 realloc()
归还。原指针 ptr
被非法化,而且任何通过它的访问是未定义行为(即使重分配是就地的)。
失败时,返回空指针。原指针 ptr
保持有效,并需要通过 free() 或 realloc()
归还。
注意
从 C11 DR 400 开始弃用对零大小的支持。
本来( C89 中),增加对零大小的支持是为了容纳这种代码:
OBJ *p = calloc(0, sizeof(OBJ)); // “零长度”占位 ... while(1) { p = realloc(p, c * sizeof(OBJ)); // 重分配,直至大小稳定 ... // 可能会修改 c 或跳出循环的代码 }
示例
运行此代码
#include <stdio.h> #include <stdlib.h> int main(void) { int *pa = malloc(10 * sizeof *pa); // 分配 10 个 int 的数组 if(pa) { printf("%zu bytes allocated. Storing ints: ", 10*sizeof(int)); for(int n = 0; n < 10; ++n) printf("%d ", pa[n] = n); } int *pb = realloc(pa, 1000000 * sizeof *pb); // 重分配数组更大的大小 if(pb) { printf("\n%zu bytes allocated, first 10 ints are: ", 1000000*sizeof(int)); for(int n = 0; n < 10; ++n) printf("%d ", pb[n]); // 展示数组 free(pb); } else { // 若 realloc 失败,则需要返回原指针 free(pa); } }
输出:
40 bytes allocated. Storing ints: 0 1 2 3 4 5 6 7 8 9 4000000 bytes allocated, first 10 ints are: 0 1 2 3 4 5 6 7 8 9
引用
- C11 standard (ISO/IEC 9899:2011):
- 7.22.3.5 The realloc function (p: 349)
- C99 standard (ISO/IEC 9899:1999):
- 7.20.3.4 The realloc function (p: 314)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.10.3.4 The realloc function