malloc
, calloc
, 和 realloc
都是用于动态内存分配的C标准库函数,但它们有不同的用途和行为。下面是它们的区别:
1. malloc
(Memory Allocation)
- 功能:
malloc
用于分配指定大小的内存块,返回指向该内存块的指针。 - 参数: 它接受一个参数,表示需要分配的字节数。
- 初始化:
malloc
分配的内存块中的内容是未初始化的,也就是说内存块中的数据是随机的,可能包含任何值。 - 示例:
这段代码分配了一个包含10个整型元素的数组的内存块,大小为int *arr = (int *)malloc(10 * sizeof(int));
10 * sizeof(int)
字节。
2. calloc
(Contiguous Allocation)
- 功能:
calloc
用于分配一个可以容纳多个相同大小元素的内存块,并将分配的内存初始化为0。 - 参数: 它接受两个参数:一个是元素的数量,另一个是每个元素的大小。
- 初始化: 与
malloc
不同,calloc
分配的内存块会被初始化为0。 - 示例:
这段代码分配了一个包含10个整型元素的数组的内存块,并将每个元素都初始化为0。int *arr = (int *)calloc(10, sizeof(int));
3. realloc
(Reallocation)
- 功能:
realloc
用于调整之前分配的内存块的大小。它可以扩大或缩小内存块的大小,并返回指向新内存块的指针。如果内存块变大了,新增部分的内容是未初始化的。 - 参数: 它接受两个参数:一个是指向之前分配的内存块的指针,另一个是新的大小。
- 初始化: 新分配的内存部分是未初始化的。如果扩展了内存块,扩展部分的内容将是随机的。
- 示例:
这段代码将之前分配的内存块扩展到可以容纳20个整型元素的大小。arr = (int *)realloc(arr, 20 * sizeof(int));
总结
malloc
适用于分配未初始化的内存块。calloc
适用于分配并初始化为0的内存块。realloc
适用于调整已有内存块的大小。
这些函数配合 free
函数使用,free
用于释放之前分配的内存,防止内存泄漏。