动态存储分配在此之前,我们用于存储数据的变量和数组都必须在说明部分进行定义。
C编译程序通过定义语句了解他们所需存储空间的大小,并预先为其分配适当的空间。
这些空间一经分配,在变量或数组的生存期内是固定不变的。
故称这种分配方式为“静态存储分配”。
C语言中还有一种称作“动态存储分配”的内存空间分配方式:在程序执行期间需要空间来存储数据时,通过“申请”分配指定的内存空间;当有闲置不用的空间时,可以随时将其释放,由系统另作它用。
用户可通过调用C语言提供的标准库函数来实现动态分配,从而得到指定数目的内存空间或释放指定的内存空间。
ANSI C标准为动态分配系统定义了四个函数,它们是:malloc、calloc、free和realloc。
使用这些函数时,必须在程序开头包含文件stdib.h。
本节只介绍malloc、calloc和free函数的使用。
1、malloc函数和free函数(1)malloc函数ANSI C标准规定malloc函数返回值的类型为void *,函数的调用形式为:malloc (size)。
要求size的类型为unsigned int。
malloc函数用来分配size个字节的存储区,返回一个指向存储区首地址的基类型为void的地址。
若没有足够的内存单元供分配,函数返回空(NULL)。
假设int型数据占2字节,float型数据占4字节存储单元,以下程序段将使pi指向一个int类型的存储单元,使pf指向一个float类型的存储单元。
int *pi;float *pf;pi=(int *)malloc(2);pf=(float *)malloc(4);由于在ANSI C中malloc函数返回的地址为void *(无值型),故在调用函数时,必须利用强制类型转换将其转换成所需的类型。
此处括号中的*号不可少,否则就转换成普通变量类型而不是指针类型了。
若有以下语句段:if(pi!=NULL) *pi=6;if(pf!=NULL) *pf=3.8;赋值后数据的存储单元情况如图7.2所示。
pi pf图7.2由动态分配得到的存储单元没有名字,只能靠指针变量来引用它。
一旦指针改变指向,原存储单元及所存储数据都将无法再引用。
通过调用malloc函数所分配的动态存储单元中没有确定的初值。
若不能确定数据类型所占字节数,可以使用sizeof运算符来求得。
例如:pi=(int *) malloc(sizeof(int));pf=(float *) malloc(sizeof(float));这是一种常用的形式。
它由系统来计算指定类型的字节数。
(2)free函数函数的调用形式为:free(p);这里指针变量p必须指向由动态分配函数malloc分配的地址。
free函数将指针p所指的存储空间释放,使这部分空间可以由系统重新支配。
此函数没有返回值。
2、calloc函数ANSI C 标准规定calloc函数返回值的类型为void *,函数的调用形式为:calloc(n,size);要求n和size的类型都为unsigned int。
calloc函数用来给n个同一类型的数据项分配连续的存储空间。
每个数据项的长度为size个字节。
若分配成功,函数返回存储空间的首地址;否则返回空。
由调用calloc函数所分配的存储单元,系统自动置初值0。
例如:char *ps;ps=(char *)calloc(10,sizeof(char));以上函数调用语句开辟了10个连续的char类型的存储单元,由ps指向存储单元的首地址。
每个存储单元可以存放一个字符。
显然,使用calloc函数动态开辟的存储单元相当于开辟了一个一维数组。
函数的第一个参数决定了一维数组的大小;第二个参数决定了数组元素的类型。
函数的返回值就是数组的首地址。
使用calloc函数开辟的动态存储单元,同样用free函数释放。