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/118927.html原文链接:https://javaforall.net

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


相关推荐

  • 在Ubuntu中安装交叉编译器_为什么一直安装中

    在Ubuntu中安装交叉编译器_为什么一直安装中本文讲述了在Ubuntu中安装pycharm的具体步骤准备环境:Ubuntu21.10,Pycharm2021.1.3具体步骤:1.首先下载pycharm:Pycharm官方下载地址我在这里选择的是2021.1.3的专业版,选择下载Linux版本的pycharm下载好的pycharm如图所示:2.右键点击刚刚下载的文件,选择提取到此处3.打开终端,输入cd命令行,进入刚刚解压文件夹下的bin文件夹,命令行是cd文件夹名称,并按回车键cdpycharm-professional-20

    2025年7月23日
    3
  • servlet的工作原理_servlet的作用

    servlet的工作原理_servlet的作用1.Servlet容器Servlet是运行Servlet容器的基础之上的,所以了解Servlet工作原理就得先从Servlet容器说起,以Tomact为例:在Tomact容器等级中,Context容器直接管理Servlet在容器中的包装类Wrapper,每个Context对应一个Web项目,所以Context如何运行直接影响到Servlet的运行。1

    2022年10月4日
    3
  • java oracle分页查询语句_oracle 分页语句

    java oracle分页查询语句_oracle 分页语句通过Debug调试,发现第一页查询到的数据没有问题,第二页时,查不到数据!第一页时,控制台打印的sql语句:SELECTOBJ_NAME,OBJ_ATTRIBUTE_NAME,ATTRIBUTE_TYPE,DES,STS,PRIORITYFROM(SELECTm.*,rownumrow_idFROM(SELECTOBJ_NAME,OBJ_ATTRIBUTE_NAME,ATT…

    2022年5月28日
    34
  • 【全网首发】言简意赅的Python全套语法,内附详细知识点和思维导图!【强烈建议收藏!】

    【全网首发】言简意赅的Python全套语法,内附详细知识点和思维导图!【强烈建议收藏!】Python是近几年比较火热的编程语言,至于有多火热?偶尔打开微信公众号,页面下面弹出的是《Python训练营》,打开朋友圈发现有推荐学习Python的课程,打开CSDN,发现热榜第一又是Python推荐文章,不得不说Python的影响力在目前还是比较大的,这和Python社区的宣传力度有着密切的关系!目前学习Python的人有多少呢?那些人在学习Python呢?至于这个问题,我认为没有一个准确的答案,因为每一天学习Python的人都在增加,学习Python被越来越多的人注重,所以要回答这个问题,最好的

    2022年6月24日
    28
  • vb.net python哪个好_VS VB

    vb.net python哪个好_VS VBPublicClassForm1   PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load       get_CPU_info()       get_net_info()       get_op_info()       get

    2022年9月27日
    4
  • Java数组(Array)

    Java数组(Array)数组(Array),是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。数组相关的概念:数组名元素角标、下标、索引数组的长度:元素的个数数组的特点:数组是按序排列的数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型创建数组对象会在内存中开辟一整块连续的空间数组的长度一旦确定,就不能修改。数组…

    2022年7月8日
    24

发表回复

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

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