在使用数组的时候,总是有一个问题,数组应该有多大?

在很多情况下,我们无法确定要使用多大的数组。一般申请大于估计数目的固定大小,这样程序在运行时就申请了固定的大小,你觉得数组定义足够大,但是如果某种原因,数组的个数增大或减小,你又必须重新修改程序,扩大数组的存储范围。这种分配固定大小内存分配的方法称为静态内存分配。但是这种分配方法存在比较严重的缺陷,特别是处理某些问题时,在大多数情况下会浪费大量的内存空间;在少数情况下,当申请的数组不够大时,可能引起下标越界错误,甚至导致严重的后果。
为了解决这个问题,提出了动态内存分配。所谓动态内存分配是指在程序执行的过程中动态地分配或者回收存储空间的内存分配方法。动态分配不像数组等静态内存分配方法需要预先申请内存空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:

  • 不需要预先分配内存空间
  • 分配的空间可以根据程序的需要扩大或缩小

1.如何实现动态内存分配及其管理

要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数。

1)malloc函数

malloc函数的原型为:

void *malloc(unsigned int size);

其作用是在内存的动态存储区中分配一个长度为size的连续空间,其参数是一个无符号整形数,返回值是一个指向所分配连续存储区域的起始地址的指针。还有一点必须强调,若函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针,所以在调用函数时应该检测返回值是否为NULL,并执行相应的操作。
下例是一个动态分配的程序:

main()
{int count,*array;//count是一个计数器,array是一个整形指针,也可以理解为指向一个整形数组的首地址if((array(int *)malloc(10*sizeof(int)))==NULL){printf("不能成功分配内存空间");exit(1);}for(count=0;count<10;count++)array[count]=count;for(count=0;count<10;count++)printf("%2d",array[count]);
}

上例中动态分配了10个整形存储区域,然后进行赋值并打印,例中if((array(int*)malloc(10*sizeof(int)))==NULL)语句可以分为以下几个部分:

  • 分配10个整形的连续存储空间,并返回一个指向其起始地址的整形指针。
  • 把此整形指针地址赋值给array
  • 检测返回值是否为NULL

2)free函数

由于内存区域总是有限的,不能无限制的分配下去,而是一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放他,以便其他的变量或者程序使用。这时就要使用到free函数,其函数原型是

void free(void *p)

作用是释放指针p所指向的内存区域。
其参数p必须是先前调用的malloc函数或calloc函数(另一个动态分配内存区域的函数)时返回的指针。给free函数传递其他的值很可能造成死机或其他灾难性的后果。
注意:这里重要的是指针的值,而不是用来申请动态内存的指针本身。例如:

int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p2);//或者free(p2)*

malloc返回值赋给p1,又把p1的值赋给p2,所以此时p1,p2都可以作为free函数的参数,malloc函数对于存储区域进行分配。free函数释放已经不用的内存区域。所以有这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。

数组大小分配(动态内存分配)相关推荐

  1. 【C/C++动态内存 or 柔性数组】——对动态内存分配以及柔性数组的概念进行详细解读(张三 or 李四)

    目录 前言(栈区.堆区.静态区) 动态内存函数 malloc与free calloc与free realloc与free 常见的动态内存错误 经典笔试题(再见张三) 柔性数组 前言(栈区.堆区.静态区 ...

  2. C语言之内存模型以及动态内存分配

    目录 内存分区模型 C/C++内存开辟 按照程序运行前后分区 程序运行前 代码区 全局区 程序运行后 栈区 堆区 关于栈 栈与静态区(数据段) 动态内存分配 那么使用动态内存的好处在哪? 常见的内存使 ...

  3. 【c++内存系列】二、c++动态内存分配和静态内存分配

    一.内存的静态分配与动态分配方式 先简单理解静态分配与动态分配: 静态内存分配和动态内存分配比较典型的例子就是数组和链表,数组的长度是预先定义好的,在整个程序中是固定不变的,所以他在内存分配时是以静态 ...

  4. 动态内存分配与柔性数组

    什么时动态内存分配 一般我们写程序都是在栈区分配空间,如果我们想根据需求想随时存放随时释放数据,堆区可以实现根据需求想系统申请所需大小的空间. 建立内存的动态分配 内存的动态分配是通过系统提供的函数来 ...

  5. c语言动态内存分配数组,【C】动态内存分配

    ## 动态内存分配的意义 C语言中的一切操作都是基于内存的 变量和数组都是内存的别名 内存分配由编译器在编译期间决定 定义数组的时候必须指定数组长度 数组长度是在编译期就必须确定的需求: 程序在运行过 ...

  6. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...

  7. C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)

    C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址.   取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符   地址的大小 ...

  8. C语言数组用到的动态内存分配

    动态内存分配 在学习数组的过程中,在输入数组时,原本想过scanf定义数组的大小再输入数组的各值,却报错. 发现原因: 1.定义数组的时必须指定数组长度 2.数组长度是在编译期就必须决定的 所以此时需 ...

  9. 二维数组及其二维数组的动态内存分配

    本文为大一时所写的文章(2017/4/9),文笔还很生疏,在很多问题上认识不深,算是在学校的微信公众号上的一个编程探究模块上的投稿,本人当时也参与了本模块的维护和管理.补档. 今天我们来聊聊二维数组及 ...

最新文章

  1. R语言ggplot2可视化使用ggplotly(plotly version of R)可视化散点图(scatter plot)
  2. 有一种尴尬,叫大厂中层
  3. 只遍历出JScript对象的expando属性
  4. 将DLINK无线AP加入到公司网络
  5. docker php composer 使用_宿主机nginx与docker的PHP搭配使用
  6. ExtJs6.5.2新手入门——如何用sencha cmd创建自己的第一个项目
  7. 邮箱解决任务间资源共享问题
  8. python娃娃_充气娃娃?Python告诉你到底有多爽......
  9. WUSTOJ 1299: 结点选择(Java)
  10. 猫狗分类--Tensorflow实现
  11. Java趣味分享:try/finally
  12. python查找文件是否存在_python脚本查找文件是否存在的方法
  13. 【软件测试】白盒测试のN-S图
  14. 宝塔linux面板安装seafile,Centos7 安装seafile 企业共享网盘
  15. 在按钮上绑定一个图案
  16. bootstrap 模态框无法使用_22 模态框Modal教程(plotly Dash Bootstrap版)
  17. Java驼峰原则_Java:标识符规则_驼峰原则
  18. 中国家电市场深度调查研究报告
  19. 成功解决http error 503.the service is unavailable错误
  20. python控件布局常用三种方法_控件布局

热门文章

  1. Unity-ShaderGraph 边缘发光与卡通火焰
  2. VSCode中使用Pylint检查python代码
  3. 使用树莓派3b+作为黑阈激活器
  4. 仿阿姨帮|58到家上门O2O系统源码( BAOCMS二次开发 )
  5. 01-【OCI 镜像】了解 OCI 镜像规范
  6. 营销管理手册_1000份!先到先得!活动管理手册+营销学院全网首发!
  7. 批量删除的三种实现方式
  8. 阿里P8架构师谈(9):流量高峰时期的性能瓶颈有哪些、以及如何来解决
  9. pyqt5实现手写中文数字识别
  10. 【Linux】Linux学习(四)Shell编程