realloc

来自cppreference.com
< 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的内存访问之前发生。所有操作一块特定内存区域的分配及归还函数拥有一个单一完整的顺序。 这种同步会在任何通过归还函数访问内存之后,并在任何通过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

[编辑] 参阅

reallocC++文档