首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

realloc

在头文件<stdlib.h>中定义

void * realloc(void * ptr,size_t new_size);

重新分配给定的内存区域。它必须预先分配malloc()calloc()realloc()尚未释放与free或呼叫realloc。否则,结果是不确定的。

重新分配由以下两者之一完成:

a)ptr如有可能,扩大或缩小指定的现有地区。该地区的内容保持不变,直至新旧尺寸中的较小者。如果区域展开,则数组新部分的内容未定义。

b)分配一个大小为new_size字节的新内存块,复制大小等于新旧大小较小者的内存区域,并释放旧块。

如果没有足够的内存,则旧的内存块不会被释放,并返回空指针。

如果ptrNULL,则行为与调用mallocnew_size)相同。

如果new_size为零,则行为是实现定义的(可能会返回空指针(在这种情况下,可能会释放或不释放旧的内存块),或者可能会返回一些可能不用于访问存储的非空指针)。

realloc是线程安全的:它的行为就像访问通过其参数可见的内存位​​置,而不是任何静态存储。先前调用free或realloc来释放内存区域的同步 - 调用任何分配函数,包括分配相同或部分同一区域内存的realloc。在通过释放函数访问内存之后以及在通过重新分配访问内存之前,会发生此同步。所有分配和解除分配功能在内存的每个特定区域都有一个总的顺序。

(自C11以来)

参数

PTR

-

指向要重新分配的内存区域的指针

new_size

-

数组的新大小

返回值

成功时,将指针返回到新分配的内存的开始位置。返回的指针必须用free()或来解除分配realloc()。原始指针ptr无效,并且对它的任何访问都是未定义的行为(即使重新分配就地)。

失败时,返回一个空指针。原始指针ptr仍然有效,可能需要使用free()or 取消分配realloc()

注释

从C11 DR 400开始不支持零大小。

最初(在C89中),增加了对零大小的支持以适应如下代码。

代码语言:javascript
复制
OBJ *p = calloc(0, sizeof(OBJ)); // "zero-length" placeholder
...
while(1) { 
    p = realloc(p, c * sizeof(OBJ)); // reallocations until size settles
    ... // code that may change c or break out of loop
}

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int *pa = malloc(10 * sizeof *pa); // allocate an array of 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); // reallocate array to a larger size
    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]); // show the array
        free(pb);
    } else { // if realloc failed, the original pointer needs to be freed
        free(pa);
    }
}

输出:

代码语言:javascript
复制
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标准(ISO / IEC 9899:2011):
    • 7.22.3.5 realloc函数(p:349)
  • C99标准(ISO / IEC 9899:1999):
    • 7.20.3.4 realloc函数(p:314)
  • C89 / C90标准(ISO / IEC 9899:1990):
    • 4.10.3.4 realloc函数

扫码关注腾讯云开发者

领取腾讯云代金券