calloc
、malloc
和 realloc
是 C 语言中用于动态内存分配的三个不同函数。它们之间的区别主要体现在功能和使用方式上。
malloc
(Memory Allocation)
malloc
用于分配指定大小的内存块。
- 参数:一个参数,表示要分配的内存大小(以字节为单位)。
- 初始化:分配的内存未初始化,内容未定义。
- 返回值:返回指向分配的内存块的指针,如果分配失败则返回
NULL
。
示例:
int *arr = (int *)malloc(10 * sizeof(int)); // 分配一个可以存储10个整数的内存块
if (arr == NULL) {
// 处理分配失败
}
calloc
(Contiguous Allocation)
calloc
用于分配一块可以存储多个元素的内存,并将内存初始化为零。
- 参数:两个参数,第一个参数是元素的个数,第二个参数是每个元素的大小(以字节为单位)。
- 初始化:分配的内存被初始化为零。
- 返回值:返回指向分配的内存块的指针,如果分配失败则返回
NULL
。
示例:
int *arr = (int *)calloc(10, sizeof(int)); // 分配一个可以存储10个整数的内存块,并初始化为零
if (arr == NULL) {
// 处理分配失败
}
realloc
(Reallocation)
realloc
用于调整之前分配的内存块的大小,可以扩大或缩小内存块。
- 参数:两个参数,第一个参数是指向之前分配的内存块的指针,第二个参数是新的大小(以字节为单位)。
- 初始化:如果新内存块大于原始大小,新分配的部分内容未定义。如果新内存块小于原始大小,多余的部分将被丢弃。
- 返回值:返回指向新内存块的指针,如果分配失败则返回
NULL
,原内存块保持不变。
示例:
int *arr = (int *)malloc(10 * sizeof(int)); // 分配初始内存块
if (arr == NULL) {
// 处理分配失败
}
int *new_arr = (int *)realloc(arr, 20 * sizeof(int)); // 调整内存块大小到可以存储20个整数
if (new_arr == NULL) {
// 处理分配失败,原内存块arr仍然有效
} else {
arr = new_arr; // 使用新的内存块
}
总结
malloc
:分配指定大小的未初始化内存块。calloc
:分配指定数量的元素并将其初始化为零。realloc
:调整之前分配的内存块的大小,可以扩展或缩小。
根据需要选择合适的函数,以便有效管理内存。