跳转到内容

C 语言 calloc 函数

来自代码酷


简介[编辑 | 编辑源代码]

calloc(全称:contiguous allocation)是C语言标准库中的一个内存分配函数,用于动态分配内存并初始化为零。与malloc函数不同,calloc在分配内存时会自动将所有字节初始化为零,适合需要清零内存的场景。其原型定义在头文件`<stdlib.h>`中:

void *calloc(size_t num, size_t size);

其中:

  • `num`:需要分配的元素数量。
  • `size`:每个元素的大小(以字节为单位)。
  • 返回值:指向分配内存的指针,失败时返回`NULL`。

工作原理[编辑 | 编辑源代码]

calloc函数执行以下步骤: 1. 计算总内存需求:total_bytes=num×size。 2. 从堆(heap)中分配连续的内存块。 3. 将内存块的所有字节初始化为零。 4. 返回指向内存块起始地址的指针。

与malloc的区别[编辑 | 编辑源代码]

  • 初始化:malloc不初始化内存,calloc初始化为零。
  • 参数形式:malloc接收总字节数,calloc接收元素数量和单个元素大小。

flowchart TD A[调用calloc(num, size)] --> B[计算num * size] B --> C{内存是否足够?} C -->|是| D[分配内存并清零] C -->|否| E[返回NULL] D --> F[返回内存指针]

代码示例[编辑 | 编辑源代码]

基础用法[编辑 | 编辑源代码]

以下示例展示如何使用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,可以避免未初始化内存导致的错误,提升代码健壮性。