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分配的内存空间在逻辑上连续的,而在物理上能够连续也能够不连续。对于我们程序猿来说,我们关注的是逻辑上的连续,由于操作系统会帮我们安排内存分配,所以我们使用起来就能够当做是连续的。

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/118927.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • arthas 案例: 动态更新应用Logger Level

    来源: case-ognl-update-logger-level案例: 动态更新应用Logger Level在这个案例里,动态修改应用的Logger Level。查找UserController的ClassLoadersc -d com.example.demo.arthas.user.UserController | grep classLoaderHash$ sc -d com.example.demo.arthas.user.UserController | grep classLo

  • telnet 1521端口不通

    telnet 1521端口不通一:场景:本机telnet虚拟机oracle数据库1521不通二:解决方法1:首先保证双方都ping通,虚拟机本地1521telnet是通的2:虚拟机防火墙设置如下:新建规则选择端口选择TCP输入端口号1521,后面一直下一步就OK了…

  • 多模态情感识别_多模态融合的情感识别研究「建议收藏」

    多模态情感识别_多模态融合的情感识别研究「建议收藏」摘要:情感是人们在沟通交流的过程中传递的重要信息,情感状态的变化影响着人们的感知和决策。情感识别是模式识别的重要研究领域,它将情感维度引入人机交互。情感表达的模态包括面部表情、语音、姿势、生理信号、文字等,情感识别本质上是一个多模态融合的问题。提出一种多模态融合的情感识别算法,从面部图像序列和语音信号中提取表情和语音特征,基于隐马尔可夫模型和多层感知器设计融合表情和语音模态的情感分类器。建立面部…

  • 【详细教程·本人亲测】解决win10家庭版系统C:\Users用户名中有中文,更改为英文的问题

    【详细教程·本人亲测】解决win10家庭版系统C:\Users用户名中有中文,更改为英文的问题【本人亲测】解决win10家庭版系统C:\Users用户名更改的问题【前言】新电脑刚买来,自带win10系统,激活时注册用户名和密码,为了方便记忆把用户名设为中文。随着后来学习和工作软件越装越多,在学习软件开发才发现Users必须为英文,此时重装系统成本极大!因此本人花了大量时间在网上寻找解决方案。但是基本上不适合win10家庭版。终于最后搜到一个方案解决,深知不易,特分享给各位。<第一…

  • 图片加载失败替换图片解决方案

    图片加载失败替换图片解决方案图片加载失败在不同浏览器表现有差异,比如google可能会一片空白、img的宽高是0*0,ie会在图片位置会出现一个碎片图标,火狐会显示一个边框像这样:一个页面如果很多这种好难看,一般会用默认图片替换显示,解决方法:1、css方案:不好使。在img的伪类加替换图片,但火狐的img没有伪类,google有,有时候就算给img标签加了width、height也没有,图片加载失败img的宽高…

  • Eclipse-环境配置-jdk1.8

    Eclipse-环境配置-jdk1.8Eclipse-环境配置-jdk1.8进入javaSE官网,按如下下载jdk1.8jdk下载位置。按照安装要求进行下载,在此是按照以下进行下载。下载后点击安装,本机是安装在C:\Java\jdk1.8.0_144位置。然后配置环境参数:3、JDK环境变量配置a、新建JAVA_HOME环境变量,JAVA_HOME=C:\Java\jdk1.8.0_144b、修改…

发表回复

您的电子邮箱地址不会被公开。

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