realloc

< c‎ | memory
定义于头文件 <stdlib.h>
void *realloc( void *ptr, size_t new_size );

重新分配给定的内存区域。它必须是之前为 malloc()calloc()realloc() 所分配,并且仍未被 freerealloc 的调用所释放。否则,结果未定义。

重新分配按以下二者之一执行:

a) 可能的话,扩张或收缩 ptr 所指向的已存在内存。内容在新旧大小中的较小者范围内保持不变。若扩张范围,则数组新增部分的内容是未定义的。
b) 分配一个大小为 new_size 字节的新内存块,并复制大小等于新旧大小中较小者的内存区域,然后释放旧内存块。

若无足够内存,则不释放旧内存块,并返回空指针。

ptrNULL ,则行为与调用 malloc(new_size) 相同。

new_size 为零,则行为是实现定义的(可返回空指针,此情况下可能或可能不释放旧内存,或返回不会用于访问存储的非空指针)。

realloc 是线程安全的:它表现得如同只访问通过其参数可见的内存区域,而非任何静态存储。

先前令 freerealloc 归还一块内存区域的调用,同步于任何分配函数的调用,包括分配相同或部分相同内存区域的 realloc 。这种同步出现于任何解分配函数所做的内存访问后,和任何 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

参阅