动态存储分配
在数组一章中,曾介绍过数组的长度是预先界说好的,在整个程序中固定不变。C言语中不允许动态数组类型。
例如:
int n;
scanf(“%d”,&n);
int a[n];
用变量表明长度,想对数组的巨细作动态阐明,这是过错的。但是在实践的编程中,往往会产生这种状况,即所需的内存空间取决于实践输入的数据,而无法预先确定。关于这种问题,用数组的方法很难处理。为了处理上述问题,C言语供给了一些内存办理函数,这些内存办理函数能够按需求动态地分配内存空间,也可把不再运用的空间收回待用,为有效地运用内存资源供给了手法。
常用的内存办理函数有以下三个:
1. 分配内存空间函数malloc
调用方式:
(类型阐明符*)malloc(size)
功用:在内存的动态存储区中分配一块长度为”size”字节的接连区域。函数的返回值为该区域的首地址。
“类型阐明符”表明把该区域用于何种数据类型。
(类型阐明符*)表明把返回值强制转化为该类型指针。
“size”是一个无符号数。
例如:
pc=(char *)malloc(100);
表明分配100个字节的内存空间,并强制转化为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。
2. 分配内存空间函数 calloc
calloc 也用于分配内存空间。
调用方式:
(类型阐明符*)calloc(n,size)
功用:在内存动态存储区中分配n块长度为“size”字节的接连区域。函数的返回值为该区域的首地址。
(类型阐明符*)用于强制类型转化。
calloc函数与malloc 函数的差异仅在于一次能够分配n块区域。
例如:
ps=(struet stu*)calloc(2,sizeof(struct stu));
其间的sizeof(struct stu)是求stu的结构长度。因而该句子的意思是:按stu的长度分配2块接连区域,强制转化为stu类型,并把其首地址赋予指针变量ps。
2. 开释内存空间函数free
调用方式:
free(void*ptr);
功用:开释ptr所指向的一块内存空间,ptr是一个恣意类型的指针变量,它指向被开释区域的首地址。被开释区应是由malloc或calloc函数所分配的区域。
【例】分配一块区域,输入一个学生数据。
main()
{
struct stu
{
int num;
char *name;
char ***;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name=”Zhang ping”;
ps->***=M;
ps->score=62.5;
printf(“Number=%dName=%s”,ps->num,ps->name);
printf(“Sex=%cScore=%f”,ps->***,ps->score);
free(ps);
}
本例中,界说了结构stu,界说了stu类型指针变量ps。然后分配一块stu大内存区,并把首地址赋予ps,使ps指向该区域。再以ps为指向结构的指针变量对各成员赋值,并用printf输出各成员值。最后用free函数开释ps指向的内存空间。整个程序包含了请求内存空间、运用内存空间、开释内存空间三个过程,完成存储空间的动态分配。