首页 > 编程笔记

C语言realloc():重新分配堆内存

realloc() 是 C语言的一个标准库函数,定义在<stdlib.h>头文件中。

realloc() 函数的功能是重新分配先前通过 malloc() 或 calloc() 申请的内存块的大小,该函数的原型如下:
void* realloc(void* ptr, size_t size);

参数

返回值

如果重新分配成功,则返回指向新内存块的指针;如果重新分配失败,则返回 NULL,原始内存块保持不变。

注意,realloc() 函数调整先前分配的内存块大小,可能会原地调整大小,也可能会重新分配一块新的堆内存。当重新分配新的内存块时,realloc() 函数会将旧块的内容复制到新位置,然后将旧块内存释放掉。这种情况下,指针 ptr 仍指向原来的旧内存块,继续使用该指针可能会导致未定义的行为。

此外,如果 size 参数的值为 0,那么 realloc() 函数的效果和 free(ptr) 相同;如果 ptr 参数的值为 NULL,那么 realloc() 函数的效果和 malloc(size) 相同。

【实例】以下是一个使用 realloc() 函数的 C语言代码示例,示例中先使用 malloc() 分配一个整数数组,然后使用 realloc() 调整它的大小。
#include <stdlib.h>
#include <stdio.h>

int main() {
    int *arr;
    int n = 5;

    // 使用 malloc 分配内存
    arr = (int*) malloc(n * sizeof(int));
    if (arr == NULL) {
        fprintf(stderr, "Memory allocation failed!\n");
        return 1;
    }

    // 初始化并打印数组
    for (int i = 0; i < n; i++) {
        arr[i] = i;
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 使用 realloc 扩展数组大小
    int new_n = 10;
    int *new_arr = (int*) realloc(arr, new_n * sizeof(int));
    if (new_arr == NULL) {
        fprintf(stderr, "Memory reallocation failed!\n");
        free(arr);
        return 1;
    }
    arr = new_arr; // 更新指针

    // 打印新数组
    for (int i = 0; i < new_n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 释放分配的内存
    free(arr);

    return 0;
}
在示例程序中,如果 realloc() 函数重新分配成功,就将指针 arr 指向新的内存块;反之重新分配失败,就释放 arr 指向的旧内存块。

再次强调,调用 realloc() 函数后要检查它的返回值,确保重新分配成功,并且在不再需要内存时及时释放它。

推荐阅读