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

【malloc和calloc】malloc和calloc函数区别

malloc和calloc函数在参数个数、初始化内存空间、函数返回值上有区别:

1、参数个数上的区别:

malloc函数:malloc(size_t size)函数有一个参数,即要分配的内存空间的大小。

calloc函数:calloc(size_t numElements,size_t sizeOfElement)有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。

2、初始化内存空间上的区别:

malloc函数:不能初始化所分配的内存空间,在动态分配完内存后,里边数据是随机的垃圾数据。

calloc函数:能初始化所分配的内存空间,在动态分配完内存后,自动初始化该内存空间为零。

malloc与calloc没有本质区别,malloc之后的未初始化内存可以使用memset进行初始化。

  1. 主要的不同是malloc不初始化分配的内存,calloc初始化已分配的内存为0。

  2. 次要的不同是calloc返回的是一个数组,而malloc返回的是一个对象。

  3. calloc等于malloc后在memset很可能calloc内部就是一个malloc再来一个memset清0。

  4. 所以malloc比calloc更高效。

  5. 分配内存空间函数malloc 调用形式: (类型说明符*) malloc (size) 。

  6. 分配内存空间函数 calloc calloc 也用于分配内存空间。

为什么多用malloc而很少用calloc?
因为calloc虽然对内存进行了初始化(全部初始化为0),但是同样也要降低效率的
calloc相当于
p = malloc();
memset(p, 0,size);
多了对内存的写零操作,而写零这个操作我们有时候需要,而大部分时间不需要

扩展资料:

    malloc()在内存中分配内存的工作机制:

malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。

调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。

然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。

接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。

到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。

于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。

如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。 

相关文章:

  • 【pthread_detach/pthread_join】pthread_detach()与pthread_join的区别?
  • 【时间复杂度】时间复杂度
  • 【Dll调试】DLL调试方法
  • 【机器学习】线性回归数学推导
  • 【VS消除警告】VS消除特定警告/安全函数警告C4996 strncpy unsafe……
  • CSDN 博客备份工具
  • 【FTP】linux FTP传文件到windows
  • 【VS】在VS中添加lib库的三种方法
  • 【合并lib】windows下多个lib合并的方法|查看lib是导入库还是静态库
  • 【python】anaconda 安装第三方包
  • 【IP/TCP】127.0.0.1和localhost和本机IP三者的区别
  • 【C/C++相互调用】C调用C++库和C++调用C库的方法
  • [STL]C++ STL中常见容器的时间复杂度
  • 【STL map】map用法、插入方法、pair和make_pair的区别
  • 【字符编码】 简洁理解ANSI,UTF8,Unicode,ASCII编码的差别
  • 10个确保微服务与容器安全的最佳实践
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Python 反序列化安全问题(二)
  • python大佬养成计划----difflib模块
  • Redis学习笔记 - pipline(流水线、管道)
  • SOFAMosn配置模型
  • tweak 支持第三方库
  • Twitter赢在开放,三年创造奇迹
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 来,膜拜下android roadmap,强大的执行力
  • 入手阿里云新服务器的部署NODE
  • 试着探索高并发下的系统架构面貌
  • 数据科学 第 3 章 11 字符串处理
  • 学习JavaScript数据结构与算法 — 树
  • 一个项目push到多个远程Git仓库
  • 由插件封装引出的一丢丢思考
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • ${factoryList }后面有空格不影响
  • (bean配置类的注解开发)学习Spring的第十三天
  • (day6) 319. 灯泡开关
  • (八)Spring源码解析:Spring MVC
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (转)大型网站架构演变和知识体系
  • (转)详解PHP处理密码的几种方式
  • (转载)(官方)UE4--图像编程----着色器开发
  • (转载)hibernate缓存
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .Net接口调试与案例
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题