链表的c语言实现(一)
筹备:动态内存分派
一、为什么用动态内存分派
但我们未进修链表的时候,假如要存储数量较量多的同范例或同布局的数据的时候,老是利用一个数组。好比说我们要存储一个班级学生的某科分数,老是界说一个float型(存在0.5分)数组:
float score[30];
可是,在利用数组的时候,总有一个问题困扰着我们:数组应该有多大?
在许多的环境下,你并不能确定要利用多大的数组,好比上例,你大概并不知道该班级的学生的人数,那么你就要把数组界说得足够大。这样,你的措施在运行时就申请了牢靠巨细的你认为足够大的内存空间。纵然你知道该班级的学生数,可是假如因为某种非凡原因人数有增加可能淘汰,你又必需从头去修改措施,扩大数组的存储范畴。这种分派牢靠巨细的内存分派要领称之为静态内存分派。可是这种内存分派的要领存在较量严重的缺陷,出格是处理惩罚某些问题时:在大大都环境下会挥霍大量的内存空间,在少数环境下,当你界说的数组不足大时,大概引起下标越界错误,甚至导致严重效果。
那么有没有其它的要领来办理这样的外呢体呢?有,那就是动态内存分派。
所谓动态内存分派就是指在措施执行的进程中动态地分派可能接纳存储空间的分派内存的要领。动态内存分派不象数组等静态内存分派要领那样需要预先分派存储空间,而是由系统按照措施的需要即时分派,且分派的巨细就是措施要求的巨细。从以上动、静态内存分派较量可以知道动态内存分派相对付景泰内存分派的特点:
1、不需要预先分派存储空间;
2、分派的空间可以按照措施的需要扩大或缩小。
二、如何实现动态内存分派及其打点
要实现按照措施的需要动态分派存储空间,就必需用到以下几个函数
1、malloc函数
malloc函数的原型为:
void *malloc (unsigned int size)
其浸染是在内存的动态存储区中分派一个长度为size的持续空间。其参数是一个无标记整形数,返回值是一个指向所分派的持续存储域的起始地点的指针。尚有一点必需留意的是,当函数未能乐成分派存储空间(如内存不敷)就会返回一个NULL指针。所以在挪用该函数时应该检测返回值是否为NULL并执行相应的操纵。
下例是一个动态分派的措施:
#include
#include
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)语句可以分为以下几步:
1)分派10个整型的持续存储空间,并返回一个指向其起始地点的整型指针
2)把此整型指针地点赋给array
3)检测返回值是否为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函数是释放已经不消的内存区域的。
所以由这两个函数就可以实现对内存区域进动作态分派并举办简朴的打点了。