********************************

malloc: 向堆申请分配内存,不初始化;

calloc: 向堆申请分配内存,初始化为0;
realloc:向堆申请分配内存,可调整大小;
alloc:  向栈申请内存,不需手动释放。

********************************

ANSI C说明了三个用于存储空间动态分配的函数
(1) malloc分配指定字节数的存储区。此存储区中的初始值不确定

(2) calloc为指定长度的对象,分配能容纳其指定个数的存储空间。该空间中的每一位(bit)都初始化为0

(3) realloc  更改以前分配区的长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定

.分配函数时再分配 realloc()
使我们可以增、减以前分配区的长度(最常见的用法是增加该区)。

如果先分配一个可容纳长度为512的数组的空间,并在运行时填充它,但又发现空间不够,则可调用realloc扩充该存储空间。

如果在该存储区后有足够的空间可供扩充,则可在原存储区位置上向高地址方向扩充,并返回传送给它的同样的指针值。

如果在原存储区后没有足够的空间,则realloc分配另一个足够大的存储区,将现存的5 1 2个元素数组的内容复制到新分配的存储区。

因为这种存储区可能会移动位置,所以不应当使用任何指针指在该区中。

注意,realloc的最后一个参数是存储区的newsize(新长度),不是新、旧长度之差。作为一个特例,若ptr是一个空指针,则realloc的功能与malloc相同,用于分配一个指定长度newsize的存储区。

这些分配例程通常通过sbrk(2)系统调用实现。该系统调用扩充(或缩小)进程的堆。虽然sbrk可以扩充或缩小一个进程的存储空间,但是大多数malloc和free的实现都不减小进程的存储空间。释放的空间可供以后再分配,但将它们保持在malloc池中而不返回给内核。

应当注意的是,大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。

将指向分配块的指针向后移动也可能会改写本块的管理信息。其他可能产生的致命性的错误是:释放一个已经释放了的块;调用free时所用的指针不是三个alloc函数的返回值等。因为存储器分配出错很难跟踪,所以某些系统提供了这些函数的另一种实现方法。每次调用这三个分配函数中的任意一个或free时都进行附加的出错检验。在调用连接编辑程序时指定一个专用库,则在程序中就可使用这种版本的函数。此外还有公共可用的资源(例如由4.3+BSD所提供的),在对其进行编译时使用一个特殊标志就会使附加的运行时间检查生效。

因为存储空间分配程序的操作对某些应用程序的运行时间性能非常重要,所以某些系统提供了附加能力。例如,SVR4提供了名为mallopt的函数,它使进程可以设置一些变量,并用它们来控制存储空间分配程序的操作。还可使用另一个名为mallinfo的函数,以对存储空间分配程序的操作进行统计。请查看所使用系统的malloc(3)手册页,弄清楚这些功能是否可用。

.alloca函数
还有一个函数也值得一提,这就是alloca。其调用序列与malloc相同,但是它是在当前函数的栈帧上分配存储空间,而不是在堆中。其优点是:当函数返回时,自动释放它所使用的栈帧,所以不必再为释放空间而费心。其缺点是:某些系统在函数已被调用后不能增加栈帧长度,于是也就不能支持alloca函数。尽管如此,很多软件包还是使用alloca函数,也有很多系统支持它。

c语言中malloc、realloc与calloc 的区别以及联系相关推荐

  1. c语言malloc作用,c语言中malloc是什么?怎么用?

    c语言中malloc是什么?怎么用? malloc() 函数用来动态地分配内存空间,其原型为:void* malloc (size_t size); 说明: [参数说明] size 为需要分配的内存空 ...

  2. C语言中malloc函数及free函数用法(定义动态数组及释放)

    一.关于静态数组.动态数组 二.malloc()和free()的基本概念以及基本用法 1.函数定义 2.函数用法 3.关于函数使用注意事项 三.malloc()函数分配内存空间的由来 四.malloc ...

  3. c语言gets和getchar区别,C语言中 gets 和 getchar 有什么区别

    C语言中 gets 和 getchar 有什么区别 发布时间:2020-07-22 09:14:29 来源:亿速云 阅读:81 作者:Leah 这期内容当中小编将会给大家带来有关C语言中 gets 和 ...

  4. C语言中fun1()和fun2(void)的区别

    C语言中fun1()和fun2(void)的区别 在一次C语言实训中我发现老师在对无参函数的书写中写成fun2(void)的形式,这引起了我的好奇心,我只知道fun1()和fun2(void)是两个无 ...

  5. C语言中的sizeof()和strlen()的区别

    C语言中的sizeof和strlen的区别 sizeof() strlen 大量案例(想深入了解可以看) 1.(花括号int的sizeof()) 2.(花括号char的sizeof()) 3.(字符串 ...

  6. 计算机汇编指令mov和mova,汇编语言中mov和lea指令的区别详解

    指令(instruction)是一种语句,它在程序汇编编译时变得可执行.汇编器将指令翻译为机器语言字节,并且在运行时由 CPU 加载和执行. 一条指令有四个组成部分: 标号(可选) 指令助记符(必需) ...

  7. C语言中malloc与free

    一.为什么c语言中要有malloc malloc就是memory allocate动态分配内存,malloc的出现时为了弥补静态内存分配的缺点,静态分配内存有如下缺点: 1.比如说,传统的一维数组,如 ...

  8. c语言is int number,C语言中NSInteger,NSNumber以及Int的区别

    NSInteger和NSNumber 首先:NSInteger,NSNumber并没有什么关系,更不要想当然的以为二者还有什么继承关系,甚至还有人问NSInteger是不是NSNumber的子类?答案 ...

  9. C语言中的strlen与sizeof的区别

    sizeof与strlen是有着本质的区别,sizeof是求数据类型所占的空间大小,而strlen是求字符串的长度,字符串以/0结尾.区别如下: (1) sizeof是一个C语言中的一个单目运算符,而 ...

  10. Java语言中 void和public void的区别,static和public static的区别。

    void 中文意思是 空的,无效的. 编程=数据结构+算法: 在Java语言中,有8种基本的基本数据类型,当用java这个对象语言去描述现实实体时.基本数据类型就用不到了,要专门来引用 一种数据来描述 ...

最新文章

  1. 教你如何处理Nginx禁止ip加端口访问的问题
  2. C++ cin相关函数总结
  3. 爆料!亦庄地区数据中心将面临史上最长群体”限电“
  4. 实用计算机相关日语词汇,计算机相关日语词汇整理2
  5. aop执行跳过某个方法_简谈前端开发中的AOP(一) -- 前端AOP的实现思路
  6. 阿里云物联网MQTT三元数生成
  7. subline text 快捷键
  8. springmvc环境搭建以及常见问题解决
  9. 关于编程学习的一些思考 | 欢迎投稿
  10. linux压缩和解压缩命令大全
  11. 如何让Python网络请求不走系统代*理*
  12. 争议下的「中台之路」,该如何破局?
  13. kindeditor php 漏洞,KindEditor漏洞、优化以及漏洞、BUG修复方案汇总
  14. 怎么用计算机按log以2为底,计算器上怎么按出log以2为底的数
  15. 如何调用Sphinx 和api接口
  16. ch340t电路_CH340电路设计 - ch340g典型应用电路
  17. 造轮子之 npm i -g creatshare-app-init 源码浅析
  18. matlab怎么求解多元非线性方程组,用matlab求解多元非线性方程组(多个方程组)问题...
  19. 使用jsfl批量生成fla文件(文件是在多个文件夹下)如果是单个文件夹下也可以
  20. Unreal资源引用(一)

热门文章

  1. [jzoj NOIP2018模拟 11.01]
  2. 2018 前端面试题(不定期更新)
  3. Zinterstore 命令
  4. js判断是安卓手机还是ios
  5. ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象...
  6. 使用Volley StringRequest Get的方式进行发票查询操作
  7. 修改GitHub记录中的invalid-email-address
  8. 运算符之:2、算术运算符(7个)
  9. [SQL Server玩转Python] 一.安装环境及T-SQL调用python脚本
  10. iOS之性能优化·优化App界面的渲染与流畅度