数组⼤⼩分配(动态内存分配)
在使⽤数组的时候,总是有⼀个问题,数组应该有多⼤?
在很多情况下,我们⽆法确定要使⽤多⼤的数组。⼀般申请⼤于估计数⽬的固定⼤⼩,这样程序在运⾏时就申请了固定的⼤⼩,你觉得数组定义⾜够⼤,但是如果某种原因,数组的个数增⼤或减⼩,你⼜必须重新修改程序,扩⼤数组的存储范围。这种分配固定⼤⼩内存分配的⽅法称为静态内存分配。但是这种分配⽅法存在⽐较严重的缺陷,特别是处理某些问题时,在⼤多数情况下会浪费⼤量的内存空间;在少数情况下,当申请的数组不够⼤时,可能引起下标越界错误,甚⾄导致严重的后果。
为了解决这个问题,提出了动态内存分配。所谓动态内存分配是指在程序执⾏的过程中动态地分配或者回收存储空间的内存分配⽅法。动态分配不像数组等静态内存分配⽅法需要预先申请内存空间,⽽是由系统根据程序的需要即时分配,且分配的⼤⼩就是程序要求的⼤⼩。从以上动、静态内存分配⽐较可以知道动态内存分配相对于静态内存分配的特点:
不需要预先分配内存空间
分配的空间可以根据程序的需要扩⼤或缩⼩
1.如何实现动态内存分配及其管理
要实现根据程序的需要动态分配存储空间,就必须⽤到以下⼏个函数。
1)malloc函数
malloc函数的原型为:
void *malloc(unsigned int size);
其作⽤是在内存的动态存储区中分配⼀个长度为size的连续空间,其参数是⼀个⽆符号整形数,返回值是⼀个指向所分配连续存储区域的起始地址的指针。还有⼀点必须强调,若函数未能成功分配存储空间(如内存不⾜)就会返回⼀个NULL指针,所以在调⽤函数时应该检测返回值是否为NULL,并执⾏相应的操作。
下例是⼀个动态分配的程序:
main()
{molloc函数
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函数释放已经不⽤的内存区域。所以有这两个函数就可以实现对内存区域进⾏动态分配并进⾏简单的管理了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论