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

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

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

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

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

举例:

[c-sharp] view plaincopy
  1. #include<stdio.h>
  2. #include<malloc.h>
  3. int main()
  4. {
  5. char *p;
  6. p=(char *)malloc(100);
  7. if(p)
  8. printf("Memory Allocated at: %x/n",p);
  9. else
  10. printf("Not Enough Memory!/n");
  11. free(p);
  12. return 0;
  13. }

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

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

malloc()函数解析相关推荐

  1. 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )

    文章目录 一.分析 malloc 函数的 arm 汇编语言 一.分析 malloc 函数的 arm 汇编语言 在上一篇博客 [Android 逆向]arm 汇编 ( 使用 IDA 解析 arm 架构的 ...

  2. linux程序卸载动态库,Intel平台下linux中ELF文件动态链接的加载、解析及实例分析(二): 函数解析与卸载...

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 相信读者已经看过了 Intel平台下Linux中ELF文件动态链接的加载.解析及实例分析(一): 加载的内容了,了解了ELF文件被加载的 ...

  3. malloc函数分配失败处理的严重性

    本次在实际测试情况下,发现程序无缘无故的异常,导致看门狗超时复位,经过排查是malloc函数分配失败的时候,依然对指针进行了操作,导致异常.以前没重视这个问题是因为,总觉的malloc基本都会成功的, ...

  4. oracle rpad mysql_Oracle生成不重复票号与LPAD,RPAD与NEXTVAL函数解析

    SELECT TO_CHAR(SYSDATE,'YYMMDD')||LPAD(REFUNDSEQ.NEXTVAL,6,'0') AS RES_ORDER_NO FROM DUAL 该语句拼接 时间 与 ...

  5. json数据解析_VBA 实践指南 -- Split函数解析Json数据

    什么是JSON? JSON(JavaScript Object Notation) 是一种及其轻量级的数据交换格式,它是 ECMAScript (欧洲计算机协会制定的JavaScript规范)的一个子 ...

  6. linux c语言 malloc动态分配指针,C语言malloc函数为一维,二维,三维数组分配空间...

    c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...

  7. C/C++ sizeof函数解析——解决sizeof求结构体大小的问题

    C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 参考文章: (1)C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 (2)https://www.cnbl ...

  8. c语言malloc函数用法_小白对c语言数组的基础总结

    数组 数组是一系列相同类型元素有序的集合. 数组的定义: 一般形式为: 类型符 数组名 [常量表达式] 如 int a[5]; 表示数组有五个元素,a[0]-a[5],不存在元素a[5]. *注意: ...

  9. 在malloc函数中为什么常用sizeof来设定内存分配的大小?

    在malloc函数中为什么常用sizeof来设定内存分配的大小? 例子:为40个整数变量分配内存并赋值,然后系统在收回这些内存. #include<stdlib.h> #include&l ...

最新文章

  1. NMS 非极大值抑制
  2. Mybatis CRUD注解Annotation的使用
  3. 201621123085 《Java程序设计》第2周学习总结
  4. 沉默已久的华为突然宣告杀入无人驾驶领域,司机将全部失业!
  5. ccform 单据打印的规则调整与新增功能发布说明
  6. git 远程仓库管理 分支创建、管理、查看、切换
  7. java的jdk是什么_什么是jdk?
  8. 【转】vmware 安装 osx 无法登录 appstore 的解决办法 (伪造smbios设备信息)
  9. MySQL 5.6, 5.7并行复制测试(二)(r12笔记第10天)
  10. VM两个虚拟机之间的通讯测试
  11. CSS3 基础(1)——选择器详解
  12. 正点原子STM32F103学习笔记(二)
  13. CCF-CSP真题《202206-2—寻宝大冒险》思路+python满分题解
  14. Android马甲包封装上架
  15. 当 Spring Cloud 遇上 SOFAStack | Meetup#2 回顾
  16. Lua -- 重写pairs方法(让字典访问有序)
  17. java交通信号灯毕业论文范文_信号灯设计论文,关于基于FPGA的交通信号灯控制系统设计相关参考文献资料-免费论文范文...
  18. 什么才是真正的云主机?辨别真假云主机
  19. 如何准备互联网大厂算法面试和笔试?
  20. Red Hat Enterprise Linux (RHEL) 8.6 发布(含下载)

热门文章

  1. 虚拟服务器放2个网站,如何一个虚拟主机空间放两个网站的基本原理
  2. java读取resouces目录下文件
  3. psql客户端乱码问题
  4. Android语音录入与邮件发送
  5. 快速排序算法的简短描述
  6. 使用频繁的正则表达式集合
  7. myqsl cluster error code 2310
  8. linux登陆界面卡死_Linux 上最好的五款音乐播放器
  9. spring依赖注入_Spring源码阅读:Spring依赖注入容器
  10. python123第五周作业答案_马哥2016全新Linux+Python高端运维班第五周作业