malloc函数具体解释

malloc函数具体解释

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

一、原型:extern void *malloc(unsigned int num_bytes);

头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是全然一致的。)

功能:分配长度为num_bytes字节的内存块

说明:假设分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

当内存不再使用时,应使用free()函数将内存块释放。

 

举例:

 

 

二、函数声明(函数原型):

  void *malloc(int size);

  说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型能够强制转换为不论什么其他类型的指针。这个在MSDN上能够找到相关的解释,详细内容例如以下:

     

malloc returns a void pointer to the allocated space, or NULL if there is insufficient memory available. To return a pointer to a type other than void, use a type cast on the return value. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object. If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item. Always check the return from malloc, even if the amount of memory requested is small.

三、malloc与new的不同点

  从函数声明上能够看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,而且能够自己主动计算所须要大小。比方:

      int *p;

  p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);

  或:

  int* parr;

  parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;

 

    而 malloc 则必须由我们计算要字节数,而且在返回后强行转换为实际类型的指针。

    int* p;

  p = (int *) malloc (sizeof(int));

 

  第一、malloc 函数返回的是 void * 类型,假设你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。

  第二、函数的实參为 sizeof(int) ,用于指明一个整型数据须要的大小。假设你写成:

  int* p = (int *) malloc (1);

  代码也能通过编译,但其实仅仅分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容所有被清空。

  malloc 也能够达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所须要内存大小。

  比方想分配100个int类型的空间:

  int* p = (int *) malloc ( sizeof(int) * 100 ); //分配能够放得下100个整数的内存空间。

  另外有一点不能直接看出的差别是,malloc 仅仅管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。

  除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其他操作上保持一致。

 

 总结:

malloc()函数事实上就在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,这里的指针变量能够是一个单独的指针,也能够是一个数组的首地址,这要看malloc()函数中參数size的详细内容。我们这里malloc分配的内存空间在逻辑上连续的,而在物理上能够连续也能够不连续。对于我们程序猿来说,我们关注的是逻辑上的连续,由于操作系统会帮我们安排内存分配,所以我们使用起来就能够当做是连续的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118351.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 网页内容监控 – 怎么才能做到网站内容实时推送百度?「建议收藏」

    网页内容监控 – 怎么才能做到网站内容实时推送百度?「建议收藏」运用业界领先的爬虫技术,判断页面内容是否有新内容产出,并过滤非站内内容,然后将内容链接推送至百度各个数据推送接口(如熊掌号、移动专区等)。网页内容监控是什么?网页内容监控是指对网站的指定页面进行定时扫描,扫描时发现与上次扫描结果有差异时进行相应处理的程序或服务。通俗来讲,网页内容监控可以实现页面有变化了,通知相应负责人或者自动处理的功能。应用场景网页内容监控的应用场景还是很多的,各…

    2022年7月17日
    24
  • JS 数字取整数方式[通俗易懂]

    JS 数字取整数方式[通俗易懂]1、parseInt(number)varnum1=parseInt(“2015nov”),//2015num2=parseInt(“”),//NaNnum3=parseInt(“0xA”),//10(十六进制)num4=parseInt(20.15),//20num5=parseInt(-20.15),//-20num6=parseInt(“070”);//56(八进制数)2、~~numbe

    2022年6月16日
    36
  • rj45 千兆接口定义_rj45 千兆接口定义_rj45接口定义,大神教你秒懂rj45的接线方法【详细方法】…

    RJ45接口通常用于数据传输,最常见的应用为网卡接口。RJ45是各种不同接头的一种类型(例如:RJ11也是接头的一种类型,不过它是电话上用的);RJ45头跟据线的排序不同的法有两种,一种是橙白、橙、绿白、蓝、蓝白、绿、棕白、棕;另一种是绿白、绿、橙白、蓝、蓝白、橙、棕白、棕;因此使用RJ45接头的线也有两种即:直通线、交插线。10100basetxRJ45接口是常用的以太网接口,支持10兆和…

    2022年4月9日
    38
  • SQL语句查询语句完整语法

    SQL语句查询语句完整语法数据库是 mysql 使用的数据库表名称是 my student 表的完整数据信息是 完整语法是 Select select 选项 字段列表 字段别名 from 数据源 where 字句 groupby 子句 having 子句 orderby 子句 limit 子句 select 选项 Select 选项包含 ALL 所有 默认 dis

    2025年10月6日
    4
  • 自定义单选框样式方法

    自定义单选框样式方法元素的初始样式都不怎么好看,我们一般修改样式会想到直接在那元素上添加样式,比如background、border等,在大多数元素上是可以这么做,但当遇上了单选框会毫无反应。例:&amp;lt;!DOCTYPEhtml&amp;gt;&amp;lt;htmllang=&quot;en&quot;&amp;gt;&amp;lt;head&amp;gt;&amp;lt;metacharset=&quot;UTF

    2022年5月25日
    46
  • linux命令 dstat,dstat命令

    linux命令 dstat,dstat命令dstat命令是一个用来替换vmstat、iostat、netstat、nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具。与sysstat相比,dstat拥有一个彩色的界面,在手动观察性能状况时,数据比较显眼容易观察;而且dstat支持即时刷新,譬如输入dstat3即每三秒收集一次,但最新的数据都会每秒刷新显示。和sysstat相同的是,dstat也可以收集指定的性能资源,…

    2022年6月18日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号