数组大小分配(动态内存分配)
在使用数组的时候,总是有一个问题,数组应该有多大?
在很多情况下,我们无法确定要使用多大的数组。一般申请大于估计数目的固定大小,这样程序在运行时就申请了固定的大小,你觉得数组定义足够大,但是如果某种原因,数组的个数增大或减小,你又必须重新修改程序,扩大数组的存储范围。这种分配固定大小内存分配的方法称为静态内存分配。但是这种分配方法存在比较严重的缺陷,特别是处理某些问题时,在大多数情况下会浪费大量的内存空间;在少数情况下,当申请的数组不够大时,可能引起下标越界错误,甚至导致严重的后果。 为了解决这个问题,提出了动态内存分配。所谓动态内存分配是指在程序执行的过程中动态地分配或者回收存储空间的内存分配方法。动态分配不像数组等静态内存分配方法需要预先申请内存空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:
- 不需要预先分配内存空间
- 分配的空间可以根据程序的需要扩大或缩小
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函数释放已经不用的内存区域。所以有这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解php用static方法的原因
- phpinfo无法显示的原因及解决办法
- 在php的yii2框架中整合hbase库的方法
- PHP安装memcache扩展的步骤讲解
- python退出循环的方法
- PHP crypt()函数的用法讲解
- Python如何自动获取目标网站最新通知
- PHP+mysql实现的三级联动菜单功能示例
- Python调用shell cmd方法代码示例解析
- 实例讲解PHP表单处理
- 用python实现名片管理系统
- keras 简单 lstm实例(基于one-hot编码)
- keras用auc做metrics以及早停实例
- Laravel中错误与异常处理的用法示例
- Laravel用户授权系统的使用方法示例