数组大小分配(动态内存分配)

时间:2022-07-24
本文章向大家介绍数组大小分配(动态内存分配),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

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

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

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函数释放已经不用的内存区域。所以有这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。