函数原型

三个函数的声明分别是:

void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t numElements, size_t sizeOfElement);

三个分配函数都在stdlib.h函数库内.基本上都是C函数库实现的,跟OS无关.C函数库内部通过一定的结构来保存当前有多少可用内存.如果程序malloc的大小超出了库里所留存的空间,那么将首先调用brk系统调用来增加可用空间,然后再分配空间.free时,释放的内存并不立即返回给os,而是保留在内部结构中. 可以打个比方: brk类似于批发,一次性的向OS申请大的内存,而malloc等函数则类似于零售,满足程序运行时的要求
使用这套机制的原因: 系统调用不能支持任意大小的内存分配(有的系统调用只支持固定大小以及其倍数的内存申请,这样的话,对于小内存的分配会造成浪费; 系统调用申请内存代价昂贵,涉及到用户态和核心态的转换

使用说明

  1. malloc用于申请一段新的地址,参数size为需要内存空间的长度。如果指定的size为0,那么返回NULL或者一个特定的非空指针

  2. calloc与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数。其分配效果类似于数组,第一个参数指定了元素个数,第二个参数指定了元素大小。如果元素个数为0,返回NULL或者一个特定非空指针

  3. realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度。对malloc calloc realloc所分配的空间进行扩展。如果newsize大于原来的大小,则新增加的那部分内存是不会被初始化的。如果ptr为空,那么执行效果等价于malloc(newsize)。如果size==0而且ptr不为空,执行效果等价于free(ptr)

  4. free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间。如果ptr为空,那么什么也不做,而如果ptr所指向的内存已经被free过了,此次调用就会发生不可预知的错误。比如释放了不该释放的空间,导致程序飞掉

注意,这里所说的空间长度都是以字节为单位

注意事项

由malloc()函数分配的内存空间原来没有被使用过,则其中 的每一位可能都是0;反之,如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。也就是说,使用malloc()函数的程序开 始时(内存空间还没有被重新分配)能正常运行,但经过一段时间后(内存空间已被重新分配)可能会出现问题。所以一般malloc之后都会使用memset()进行内存空间的初始化

calloc() 函数会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为零;如果你是 为指针类型的元素分配内存,那么这些元素通常(但无法保证)会被初始化为空指针;如果你是为实数类型的元素分配内存,那么这些元素可能(只在某些计算机 中)会被初始化为浮点型的零。也就是说对于指针类型或者是浮点类型,calloc()并不能保证初始化为正确的零值

malloc calloc realloc的对比相关推荐

  1. 内存分布malloc/calloc/realloc/free/new/delete、内存泄露、String模板、浅拷贝与深拷贝以及模拟string类的实现

    内存分布 一.C语言中的动态内存管理方式:malloc/calloc/realloc和free 1.malloc: 从堆上获得指定字节的内存空间,函数声明:void *malloc (int n); ...

  2. C语言动态申请内存空间之malloc(),calloc(),realloc()函数

    在C语言中用于动态申请内存空间的函数主要为malloc()函数,calloc()函数,以及realloc()函数,以下主要介绍三个函数的用法,区别以及使用时的注意事项. malloc(),calloc ...

  3. c语言malloc,calloc,realloc函数介绍

    malloc,calloc,realloc动态内存管理函数的出现解决了在某些c语言标准中不能使用变长数组的问题 这三个函数的使用需要头文件stdlib.h,这些函数开辟的空间在堆区,系统不会自动释放, ...

  4. malloc/calloc/realloc

    malloc/calloc/realloc和free介绍: malloc函数 malloc函数可以从堆上获得指定字节的内存空间,其函数声明如下: void * malloc(int n); 参数释义: ...

  5. malloc calloc realloc 三兄弟!!!

    学习过C语言的都知道 malloc calloc realloc 这三个函数,这三个函数都是用于动态的分配内存的,最后都要使用 free函数进行释放. 这三个函数的头文件 : stdlib.h 在li ...

  6. c语言释放内存函数,【C语言】内存分配函数malloc/ calloc/ realloc及内存释放free

    前言: 内存区域划分与分配: 1.栈区(stack)--程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放. 2.堆区(heap) -- 在内存开辟另一块存储区域 ...

  7. C++自学21:动态分配内存(malloc/calloc/realloc/new)/回收内存(free/delete)

    一:malloc函数,请求系统分配内存 // 让系统分配8个字节的内存,这8个字节是连续的,就是一个数组 int* a=(int*)malloc(8); // 如果分配成功,则返回数组首字节的地址,分 ...

  8. malloc,calloc,realloc,free函数

    在进行C/C++编程的时候,需要程序员对内存的了解比较清楚,经常需要操作的内存可分为下面几个类别: 1.堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取 ...

  9. 浅谈malloc,calloc,realloc函数之间的区别

    内存区域可以分为栈,堆,静态存储区和常量存储区.局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的. C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:m ...

最新文章

  1. 在3ds Max和Vray中创建赛博朋克圣诞老人室内场景
  2. 图像检索:Fisher Information Matrix and Fisher Kernel
  3. ARM学习书单一提供打包下载地址
  4. centos7下nginx配置
  5. Jboss应用使用jconsole进行性能监测
  6. 长短期记忆(LSTM)相关知识
  7. C++笔记——有关内存对齐
  8. oracle监听无法启动常用解决办法
  9. JAVA反射机制初步理解
  10. (28)VHDL实现数码管直译
  11. 13. 为什么我们会需要 Pod?
  12. python能做什么毕业设计-毕业设计涉及到python?看我用Python优雅的写论文!
  13. TiDB RC1 Release
  14. springboot整合rpc远程调用_SpringBoot—-JsonRpc跨语言远程调用协议 - Java天堂
  15. 拉普拉斯金字塔融合原理浅析
  16. c语言在线翻译器,command(c语言翻译工具)
  17. 在网页中打开展示pdf文件
  18. Apache Geronimo 监控
  19. C语言位运算-实现Photoshop反向功能
  20. ERNIE-ViLG文心跨模态AI绘画大模型——中文版stable-diffusion

热门文章

  1. 怎么检查linux是否中病毒,linux中怎么检查是否有安装xinted这个服务
  2. python取特定年份的数据_python,_怎样用python提取不同股票csv里特定时间段的数据,python - phpStudy...
  3. HALCON No finder pattern could be found错误解决
  4. mqtt 串口_MQTT网关介绍及应用原理
  5. SpringBoot2.XX 产生的问题
  6. SpringtMVC中配置 mvc:annotation-driven/ 与 mvc:default-servlet-handler/ 的作用
  7. 用vue优雅地编写UI组件的几条指导原则
  8. 10个顶级的CSS UI开源框架
  9. java 语言中System.getProperty(user.dir)
  10. 解决Android的ListView控件滚动时背景变黑