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

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

功能:分配长度为num_bytes字节的内存块 
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 
当内存不再使用时,应使用free()函数将内存块释放。

举例:

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

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

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

C++ 中malloc函数详解(转载)相关推荐

  1. Matlab中 pdist 函数详解

    学习笔记,仅供参考,有错必纠 转载自:Matlab中 pdist 函数详解(各种距离的生成); pdist Pairwise distance between pairs of objects. Sy ...

  2. matlab中xcorr函数详解

    Matlab中xcorr函数详解 引言 在matlab中查找相关函数时,找到了xcov函数和xcorr函数,仔细看了帮助文档,发现虽然计算公式不一样,但是两个函数用法相同,计算出的值也相同,于是在翻了 ...

  3. c++ memset 语言_C/C++ 中memset() 函数详解及其作用介绍

    memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *memset(void *s, int v, si ...

  4. Linux中fork()函数详解

    Linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  5. linux 中 sigaction 函数详解

    linux 中 sigaction 函数详解 一.函数原型 sigaction 函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作) int sigaction(int signum, ...

  6. c语言之 malloc函数详解 在堆中动态分配内存malloc和new的区别

    一.原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc ...

  7. java 中indexOf函数详解

    最近在解决android 中listview的查找问题,用到了indexOf 方法,仔细看了下源码,详解如下. private static int indexOf(String source, St ...

  8. PHP中preg_match函数详解

    目录 函数形式 函数功能 参数详解 pattern sbuject matches 返回值 例子 函数形式 preg_match(string $pattern, string $subject, a ...

  9. c语言malloc函数程序,c语言 malloc函数详解

    谈到malloc函数相信学过c语言的人都很熟悉,但是malloc底层到底做了什么又有多少人知道. 1.关于malloc相关的几个函数 关于malloc我们进入Linux man一下就会得到如下结果: ...

最新文章

  1. 大厂线上案例复盘--代码漏洞
  2. iOS 关于UIView覆盖StatusBar的小知识点
  3. 在计算机网络中光缆的工作原理是什么,计算机网络原理期中考试试卷(A)
  4. 网易在AI上更注重于落地应用
  5. 偈颂一首《静心莲》【心静如止水,雷打无波澜。佛前忏一刹,万千罪消融。】
  6. Linux学习之系统编程篇:shm 共享内存及其操作函数
  7. javafx8配置参数列表
  8. 中秋佳节,献上笔试题一道,祝各位事业蒸蒸日上!
  9. 在线HTTP POST/GET接口测试 地址
  10. 图解GC(垃圾回收)复制算法加强版(1)Cheney的复制算法
  11. 小程序内嵌H5、H5回跳至小程序、小程序打开公众号中的文章
  12. 石器时代地图->魔力宝贝地图
  13. 线上教学软件哪个平台好?
  14. 如何在openlayers中使用iconfont或font Awesome字体图标
  15. 新浪云sae springboot项目部署
  16. vi颜色显示设置(centos7)
  17. linux视频拼接工具,linux中使用ffmpeg 无损剪切/拼接视频程序
  18. 如何用PHP调用学小易题库,如何使用 PHP 输出 hello world?()
  19. 测试台式计算机测试是否联通笔记本电脑,测试台式计算机测试(192.168.1.11)是否联通笔记本电脑(192.168.1.12),表示联通了的截图是 。...
  20. 群晖AndroidTV-DSvideo,电视安装后无图标解决方案及原理

热门文章

  1. 华为android能用几年,最强的国产安卓,一部华为手机能用多久?
  2. xml文件为什么在IE中打开为空白页
  3. flash分类:NORflash和NANDflash
  4. 用MFC写一个随机抽号的软件(VS2013)
  5. 【服务器】多人共享服务器用户管理
  6. micropython在stm32跑一跑_TPYBoard——能跑micropython的,基于STM32F405单片机的开发板...
  7. 经典算法面试题:高楼扔鸡蛋
  8. 华为笔记本linux驱动支持,华为笔记本电脑对Linux 5.5内核的支持得到改善
  9. 混合牛奶 Mixing Milk
  10. FFMPEG基本操作命令指南(一)