C 语言 calloc 函数
外观
简介[编辑 | 编辑源代码]
calloc(全称:contiguous allocation)是C语言标准库中的一个内存分配函数,用于动态分配内存并初始化为零。与malloc函数不同,calloc在分配内存时会自动将所有字节初始化为零,适合需要清零内存的场景。其原型定义在头文件`<stdlib.h>`中:
void *calloc(size_t num, size_t size);
其中:
- `num`:需要分配的元素数量。
- `size`:每个元素的大小(以字节为单位)。
- 返回值:指向分配内存的指针,失败时返回`NULL`。
工作原理[编辑 | 编辑源代码]
calloc函数执行以下步骤: 1. 计算总内存需求:。 2. 从堆(heap)中分配连续的内存块。 3. 将内存块的所有字节初始化为零。 4. 返回指向内存块起始地址的指针。
与malloc的区别[编辑 | 编辑源代码]
- 初始化:malloc不初始化内存,calloc初始化为零。
- 参数形式:malloc接收总字节数,calloc接收元素数量和单个元素大小。
代码示例[编辑 | 编辑源代码]
基础用法[编辑 | 编辑源代码]
以下示例展示如何使用calloc分配一个包含5个整数的数组:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 5;
// 分配并初始化内存
arr = (int *)calloc(n, sizeof(int));
if (arr == NULL) {
printf("内存分配失败\n");
return 1;
}
// 打印初始值(应为0)
for (int i = 0; i < n; i++) {
printf("arr[%d] = %d\n", i, arr[i]);
}
free(arr); // 释放内存
return 0;
}
输出:
arr[0] = 0 arr[1] = 0 arr[2] = 0 arr[3] = 0 arr[4] = 0
实际应用案例[编辑 | 编辑源代码]
假设需要动态分配一个结构体数组并初始化:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id;
char name[20];
float score;
} Student;
int main() {
Student *class;
int num_students = 3;
class = (Student *)calloc(num_students, sizeof(Student));
if (class == NULL) {
printf("内存分配失败\n");
return 1;
}
// 检查初始化结果
for (int i = 0; i < num_students; i++) {
printf("Student %d: id=%d, name='%s', score=%.1f\n",
i, class[i].id, class[i].name, class[i].score);
}
free(class);
return 0;
}
输出:
Student 0: id=0, name='', score=0.0 Student 1: id=0, name='', score=0.0 Student 2: id=0, name='', score=0.0
注意事项[编辑 | 编辑源代码]
1. 内存泄漏:使用后需调用`free`释放内存。 2. 溢出风险:若`num * size`超过`size_t`范围,可能导致未定义行为。 3. 性能:calloc的初始化操作可能比malloc慢,但安全性更高。
常见问题[编辑 | 编辑源代码]
为什么calloc比malloc慢?[编辑 | 编辑源代码]
因为calloc需要额外步骤将内存清零。在不需要初始化时,可使用malloc提高性能。
calloc分配的内存一定是零吗?[编辑 | 编辑源代码]
在标准C中,calloc保证内存初始化为零。但某些嵌入式平台可能不遵循此规则。
总结[编辑 | 编辑源代码]
calloc是C语言中重要的动态内存分配函数,特别适合需要清零内存的场景。通过合理使用calloc,可以避免未初始化内存导致的错误,提升代码健壮性。