当前位置: 首页 > news >正文

【嵌入式】C语言中malloc()和calloc()的区别

在C语言中,malloc()calloc() 都是动态内存分配函数,它们都用于在堆上分配内存,但它们在分配内存的方式和初始化内存内容方面存在一些区别。以下是它们的详细对比:

1. 函数原型

  • malloc()

    void* malloc(size_t size);
    
    • 参数:size 表示要分配的内存字节数。
    • 返回值:成功时返回指向分配的内存块的指针,失败时返回 NULL
  • calloc()

    void* calloc(size_t num, size_t size);
    
    • 参数:num 表示要分配的元素个数,size 表示每个元素的大小(以字节为单位)。
    • 返回值:成功时返回指向分配的内存块的指针,失败时返回 NULL

2. 内存分配方式

  • malloc()

    • 只需要指定要分配的总字节数。
    • 例如,malloc(100) 会分配一个大小为100字节的内存块。
  • calloc()

    • 需要指定两个参数:元素个数和每个元素的大小。
    • 例如,calloc(25, 4) 会分配一个包含25个元素,每个元素大小为4字节的内存块,总大小为 25 * 4 = 100 字节。

3. 内存初始化

  • malloc()

    • 分配的内存内容是未初始化的,其值是随机的,可能包含任意数据。
  • calloc()

    • 分配的内存内容会被初始化为0。这意味着分配的内存块中的所有字节都会被设置为0。

4. 使用场景

  • malloc()

    • 适用于需要动态分配内存但不需要初始化的场景。
    • 例如,分配一个动态数组,但后续会立即对数组进行赋值。
  • calloc()

    • 适用于需要动态分配内存并确保内存内容为0的场景。
    • 例如,分配一个动态数组并将其用作计数器、标志位等,或者分配一个结构体数组并确保所有字段初始值为0。

5. 性能和效率

  • malloc()

    • 通常比 calloc() 更快,因为它不需要进行内存初始化操作。
  • calloc()

    • 由于需要初始化内存为0,可能会比 malloc() 稍微慢一些,尤其是在分配大块内存时。

示例代码

使用 malloc()
#include <stdio.h>
#include <stdlib.h>

int main() {
    int* arr = (int*)malloc(5 * sizeof(int)); // 分配5个整数的内存
    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    // 手动初始化内存
    for (int i = 0; i < 5; i++) {
        arr[i] = 0;
    }

    // 使用数组
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    free(arr); // 释放内存
    return 0;
}
使用 calloc()
#include <stdio.h>
#include <stdlib.h>

int main() {
    int* arr = (int*)calloc(5, sizeof(int)); // 分配5个整数的内存并初始化为0
    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    // 使用数组
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    free(arr); // 释放内存
    return 0;
}

总结

  • malloc():分配未初始化的内存,适合不需要初始化的场景。
  • calloc():分配并初始化为0的内存,适合需要初始化为0的场景。

在实际编程中,选择哪种函数取决于具体需求。如果需要初始化为0,建议使用 calloc();如果不需要初始化,或者后续会立即覆盖内存内容,建议使用 malloc()

相关文章:

  • kotlin 内联函数 inline
  • Python编写服务监控程序
  • Unity Shader编程】之透明物体渲染
  • 第五: redis 安装 / find 查找目录
  • JVM常用概念之身份哈希码
  • Apache SeaTunnel脚本升级及参数调优实战
  • 指令系统(2017统考真题)
  • 人工智能在电子信息工程信号处理中的应用调研
  • 离线黑客攻击之绕过BIOS/EFI
  • openstack安装部署
  • docker-存储卷-网络
  • 游戏MOD伴随盗号风险,仿冒网站借“风灵月影”窃密【火绒企业版V2.0】
  • 存算分离是否真的有必要?从架构之争到 Doris 实战解析
  • INT202 Complexity of Algroithms 算法的复杂度 Pt.2 Search Algorithm 搜索算法
  • Error: The resource name must start with a letter
  • 代码随想录第55期训练营第七天|LeetCode454.四数相加II、383.赎金信、15.三数之和、18.四数之和
  • 基于javaweb的SSM+Maven宠物领养宠物商城流浪动物管理系统与实现(源码+文档+部署讲解)
  • 【PCIe 总线及设备入门学习专栏 3.2 -- PCIe 在进行大数据搬运时是如何组包的?】
  • 【STM32实物】基于STM32的太阳能充电宝设计
  • Android adb调试应用程序
  • 中科院院士魏辅文已卸任江西农业大学校长
  • 多地跟进官宣下调公积金贷款利率,最低降至2.1%
  • 上海黄浦区拟73.2654亿元协议出让余庆里7宗组合地块
  • 竞彩湃|巴萨客场淘汰国际米兰,巴黎双杀阿森纳
  • 为什么有的人闻到烟味,会咳嗽、胸闷?别再伤害身边的人
  • 韩国总统选举民调:共同民主党前党首李在明支持率超46%