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

server/2025/3/29 21:58:57/

在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个整数的内存并初始化为0if (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()


http://www.ppmy.cn/server/179348.html

相关文章

react ant design树穿梭框实现搜索并展开到子节点、同级节点选择及同时选择数量限制功能

功能点&#xff1a; 点击节点前的箭头&#xff0c;可以手动展开或折叠该节点的子节点。在搜索框中输入关键词&#xff0c;匹配的节点及其父节点会自动展开。清空搜索框后&#xff0c;恢复到用户手动控制的展开状态。勾选节点时仍然遵守 "最多勾选 6 个节点" 和 &quo…

快速入手-基于Django的主子表间操作mysql(五)

1、如果该表中存在外键&#xff0c;结合实际业务情况&#xff0c;那可以这么写&#xff1a; 2、针对特殊的字典类型&#xff0c;可以这么定义 3、获取元组中的字典值和子表中的value值方法 4、对应的前端页面写法

Stable Diffusion教程:图生图_stable diffusion 图生图

本文主要分为四部分&#xff1a; 1. 图生图原理 2. 图生图流程介绍 3. 随机种子Seed的应用 4. 图生图应用场景 今天开始讲解 SD 的「图生图」功能。你一定看到过下面这样的例子&#xff0c;通过原图通过AI绘画加工成自己想要的图片。 在 Midjourney 中叫「垫图」&#xf…

pnpm 报错 Error: Cannot find matching keyid 解决

1. 查看corepack版本&#xff0c;升级至0.31.0 npm i -g corepack0.31.0 这里注意环境变量&#xff0c;可能升级后还是指向旧版本&#xff0c;可以选择更新环境变量或者删除原指向的corepack命令 2. 更新pnpm corepack install -g pnpmlatest 问题解决。

Gradle Project import Eclipse

Gradle Project import Eclipse

【网络安全 | 漏洞挖掘】绕过管理员权限撤销的访问控制漏洞

未经许可,不得转载。 文章目录 前言正文漏洞分析前言 该应用程序是一个允许用户创建组织、跟踪其网站并提供多种功能的应用。此外,管理员可以邀请其他用户并为其分配自定义权限。 我不清楚该应用的具体技术栈和开发语言,但我知道它的权限配置可能非常复杂,因为这个漏洞本…

Qt——使用第三方库QtXlsx操作Excel表,实现MySQL读取的数据保存至excel文件

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…

Web前端之JavaScript的DOM操作冷门API

MENU 前言1、Element.checkVisibility()2、TreeWalker3、Node.compareDocumentPosition()4、scrollIntoViewIfNeeded()5、insertAdjacentElement()6、Range.surroundContents()7、Node.isEqualNode()8、document.createExpression()小结 前言 作为前端开发者&#xff0c;我们每…