当前位置:文档之家› 动态存储分配

动态存储分配

动态存储分配在此之前,我们用于存储数据的变量和数组都必须在说明部分进行定义。

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函数释放。

相关主题