什么是malloc

malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。

什么是malloc

一、什么是malloc

malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。

其函数原型为void *malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。

二、工作机制

malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表的功能。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。

Linux Libc6采用的机制是在free的时候试图整合相邻的碎片,使其合并成为一个较大的free空间。

延伸阅读

与new的区别

从本质上来说,malloc(Linux上具体实现可以参考man malloc,glibc通过brk()&mmap()实现)是libc里面实现的一个函数,如果在source code中没有直接或者间接include过stdlib.h,那么gcc就会报出error:‘malloc’ was not declared in this scope。如果生成了目标文件(假定动态链接malloc),如果运行平台上没有libc(Linux平台,手动指定LD_LIBRARY_PATH到一个空目录即可),或者libc中没有malloc函数,那么会在运行时(Run-time)出错。new则不然,是c++的关键字,它本身不是函数。new不依赖于头文件,c++编译器就可以把new编译成目标代码(g++4.6.3会向目标中插入_Znwm这个函数,另外,编译器还会根据参数的类型,插入相应的构造函数)。

在使用上,malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。

文章标题:什么是malloc,发布者:E.Z,转载请注明出处:https://worktile.com/kb/p/62026

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
E.ZE.Z认证作者
上一篇 2023年7月27日 下午9:12
下一篇 2023年7月27日 下午9:20

相关推荐

  • 基坑支护属于什么编程

    基坑支护并不属于任何编程领域,而是土木工程中的一个重要概念。它在确保基坑施工安全方面发挥着至关重要的作用。其中,深挖基坑支护的技术和方法对于预防土体滑移和坍塌具有显著效果,尤其是在复杂地质条件下或在城市密集区域的施工中。 一、基础概念 基坑支护技术主旨在于为深挖工程提供临时或永久性的侧向支撑,避免因…

    2024年4月26日
    1200
  • 学编程应该学些什么知识

    学习编程应该掌握的知识包括 1、 基本语法与数据结构、 2、 算法、 3、 版本控制系统、 4、 数据库知识、 5、 计算机网络基础、 6、 操作系统原理、 7、 设计模式。其中,算法 是编程中不可缺少的核心技能。它不仅影响程序的性能,还直接关系到解决问题的效率和方法。掌握算法的基本原理和常用算法能…

    2024年4月27日
    700
  • 红壳用什么编程语言

    红壳(Redis)主要使用C语言编写,其性能优异且具备高度的移植性。 C语言为Redis提供了执行速度快和访问底层系统资源能力的优势。它通过高效的内存管理和非阻塞I/O模型来保证数据操作的速度。此外,Redis的单线程模型简化了并发访问的复杂性,让它能够处理大量并发连接,同时确保每个操作的原子性。 …

    2024年4月27日
    1200
  • 编程培训学什么好

    编程培训学什么好? 在选择编程培训的课程时,建议关注以下几个方面:1、语言基础与应用,2、算法与数据结构,3、项目和实践,4、软件开发流程与工具。特别是语言基础与应用,它是编程学习的基石,覆盖了从语法到核心库的使用,不同编程语言有不同的应用场景,如Python在数据科学和人工智能领域广泛应用,Jav…

    2024年4月26日
    1400
  • DevOps与持续集成/持续交付工具的比较

    DevOps重在文化和实践的推广,旨在缩短软件开发周期、提高交付效率和质量。持续集成(CI)1、和持续交付(CD)2、是实现DevOps的关键工具,它们促进了开发与运维团队的协作。CI侧重于开发过程中的代码集成,CD扩展CI的原则来确保软件可以可靠的释放。CI/CD工具,如Jenkins、GitLa…

    2024年1月4日
    28700
  • devops是什么工具

    DevOps作为一种软件开发的实践,追求开发与运维的高度协同、持续集成、快速交付和高质量的自动化。涉及多元化的工具集,用以支撑这一实践理念的实施。1、版本控制中具有代表性的工具是Git,为代码共享、跟踪与协同提供必要环境。2、持续集成(CI)环节关键工具如Jenkins, 实现代码频繁合并到主干。3…

    2024年3月26日
    7500
  • 单片机编程dec什么意思

    单片机编程中的DEC是指将数据转换为十进制格式的指令或表示方法。 在许多程序设计语言和环境中,DEC通常用于在输出时将数值数据由内部格式,例如二进制或十六进制,转换为更便于人类阅读的十进制格式。对于单片机编程,这个转换过程特别重要,因为单片机在内部处理信息时主要使用二进制格式。然而,在与用户交互或在…

    2024年4月27日
    700
  • cells编程中什么意思

    在编程中,"Cells"通常指的是表格中的单元格或数据结构中的个体存储位置。它们在处理电子表格、数据库和特定类型的编程语言中扮演着关键角色。 具体地,当提到电子表格(如Microsoft Excel或Google Sheets),"Cell"指的是交点,即由行…

    2024年4月27日
    1000
  • 喷油嘴编程是什么意思

    喷油嘴编程是指对发动机喷油系统中的电子喷油嘴进行参数设置和调整的过程, 它涉及到调节喷油量、喷油时机等因素,以确保发动机在不同工况下能够实现最优的燃烧效率和性能输出。在喷油嘴编程过程中,关键的一点是确保喷油嘴可以精确地根据发动机的需要,调配适量的燃油进入燃烧室。这不但涉及到燃油的压力、流量和喷雾质量…

    2024年4月27日
    900
  • 到底什么是乐高编程软件

    乐高编程软件是一款专为儿童和青少年设计的图形化编程工具,旨在通过乐高机器人或仿真模型讲授编程概念。 其中,乐高Mindstorms系列中的EV3编程软件是最广为人知的一个例子。这个软件不仅引入了基础的编程概念,比如循环和条件语句,而且还允许用户通过拖放式界面来控制和命令机器人。 使用乐高编程软件,孩…

    2024年4月27日
    600

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部