首页 > 编程笔记
C语言realloc():重新分配堆内存
realloc() 是 C语言的一个标准库函数,定义在
realloc() 函数的功能是重新分配先前通过 malloc() 或 calloc() 申请的内存块的大小,该函数的原型如下:
注意,realloc() 函数调整先前分配的内存块大小,可能会原地调整大小,也可能会重新分配一块新的堆内存。当重新分配新的内存块时,realloc() 函数会将旧块的内容复制到新位置,然后将旧块内存释放掉。这种情况下,指针 ptr 仍指向原来的旧内存块,继续使用该指针可能会导致未定义的行为。
此外,如果 size 参数的值为 0,那么 realloc() 函数的效果和 free(ptr) 相同;如果 ptr 参数的值为 NULL,那么 realloc() 函数的效果和 malloc(size) 相同。
【实例】以下是一个使用 realloc() 函数的 C语言代码示例,示例中先使用 malloc() 分配一个整数数组,然后使用 realloc() 调整它的大小。
再次强调,调用 realloc() 函数后要检查它的返回值,确保重新分配成功,并且在不再需要内存时及时释放它。
<stdlib.h>
头文件中。realloc() 函数的功能是重新分配先前通过 malloc() 或 calloc() 申请的内存块的大小,该函数的原型如下:
void* realloc(void* ptr, size_t size);
参数
- ptr:指向先前由 malloc() 或 calloc() 分配的内存块。
- 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() 函数后要检查它的返回值,确保重新分配成功,并且在不再需要内存时及时释放它。