文章目录
malloc 与 realloc
malloc
和 realloc
都是 C 语言标准库中的函数,用于动态内存分配。它们在使用上有明显的区别:
malloc
malloc
(Memory Allocation)用于分配一块新的未初始化的内存。- 分配的内存大小是由参数指定的,单位是字节。
- 如果内存分配成功,它返回一个指向分配内存的指针。
- 如果内存分配失败,它返回
NULL
。 - 分配的内存内容是未初始化的,可能包含任意数据(垃圾值)。
c
#include <stdlib.h>
int *arr = (int *)malloc(10 * sizeof(int)); // 分配一个整型数组,大小为 10 个整数
if (arr == NULL) {
// 处理内存分配失败
}
realloc
realloc
(Re-Allocation)用于重新分配之前已经分配的内存块的大小。- 它允许增大或减小原有内存块的大小。
- 第一个参数是指向原有内存块的指针,第二个参数是新的内存大小。
- 如果内存重新分配成功,它返回一个指向新内存的指针,可能与原来的指针不同。
- 如果内存重新分配失败,它返回
NULL
,且原有内存块保持不变。 - 当增大内存块时,新分配的内存部分内容是未初始化的。
- 如果新的内存大小为零,行为与标准不一定一致,有些实现可能返回
NULL
,有些可能返回一个可安全free
的非NULL
指针。
c
#include <stdlib.h>
int *arr = (int *)malloc(10 * sizeof(int)); // 最初分配内存
if (arr == NULL) {
// 处理内存分配失败
}
int *new_arr = (int *)realloc(arr, 20 * sizeof(int)); // 尝试重新分配为更大的大小
if (new_arr == NULL) {
// 处理内存重新分配失败,原始 arr 依然有效,需要最终释放
} else {
arr = new_arr; // 更新 arr 指针为新内存的地址
}
主要差异点
- 目的 :
malloc
用于初次分配内存,realloc
用于修改已分配内存的大小。 - 初始化 :
malloc
不会初始化内存,realloc
保留原有内存内容并且可能会添加未初始化的内存。 - 指针 :
realloc
需要一个已分配内存的指针参数,malloc
不需要。 - 使用场景 : 当 不确定最初需要多少内存,或者 的内存需求可能会改变时,使用
realloc
可以调整内存大小。
在使用 realloc
时,如果返回一个新的指针, 应该用新指针替换旧指针。如果 realloc
调用失败,它返回 NULL
,但原先的内存还是要通过旧指针来释放的。
一定要记得,用 malloc
、calloc
或 realloc
分配的内存都必须通过 free
函数来释放,以避免内存泄漏。