1.动态内存分配的含义
c语言允许建立动态内存分配区域,以存放一些临时用的数据,这些数据不必再程序的声明部分定义,也不必等到函数结束时才释放,而是要随时开辟,不需要随时释放,这些数据是临时存放在一个特定的自由存储区(堆),可以根据需要向系统申请所需要大小的空间,由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用。
2.建立内存的动态分配
对内存的动态分配是通过系统提供的函数库来实现的,主要有malloc,calloc,free,realloc这四个函数:
(1).使用malloc函数
其函数原型为void *malloc(unsigned int size);
其作用是在内存的动态存储区域中分配一个长度为size的连续空间,形参size的类型定义为无符号整形(不允许为负数)。次函数的值(即返回值)是所分配区域的第一 个字节的地址,或者说,次函数是一个指针型函数,返回的指针指向该分配区域的开头位置,如:
malloc(100)//开辟100字节的临时分配区域,函数值为其第一个字节的地址
注意其指针的基类型为void,即不能执行任何类型的数据,只能提供一个地址,如果此函数未能成功执行(如内存空间不足),则返回空指针。
(2).使用calloc函数
其函数原型为void *calloc(unsigned n, unsigned size);
其作用是在内存的动态区域中分配长度为size的连续空间,这个空间一般比较大,足以保存一个数组。
用calloc函数可以为以为数组来开辟动态存储空间,n为数组元素的个数,每个元素的长度为size,这就是动态数组,函数返回所分配区域的其实位置指针;如果分配不 成功,返回NULL。如
p = calloc(50,4);//开辟50X4个字节的临时分配区域,把起始地址赋给指针变量p
(3).使用free函数
其原型为void free(void *p);
其作用是释放指针变量p所指的动态空间,使这部分空间能重新被其他变量使用,p应该是最近一次调用calloc或malloc函数得到的函数返回值,如;
free(p) //释放指针变零p所指向的已知的分配的动态空间
free函数物返回值
(4).使用realloc函数
其原型为void *realloc(void *p, unsigned int size);
如果已经通过malloc函数或calloc函数获得了动态空间,向改变其大小,可以用realloc函数重新分配。
用realloc函数将p所指向的动态空间的大小改变为size,p的值不变,如果重新分配不成功,返回NULL 如
realloc(p,50) //将所指的已分配的动态空间该为50个字节
以上4个函数的声明在stdlib.h头文件中,在用到这些函数的时候应用#“include<stdlib.h>”指令把stdlib.h头文件包含到程序文件中
3.void指针类型
C99允许使用基类型为void的指针类型。可以定义一个基类型为void的指针变量(即void*型变量),它不指向任何类型的数据。把void指针赋给不同基类型的指针变量(或相反)时,编译系统会自动的进行转换,不必用户自己进行强制类型转换,如 void *p1; int a = 3;p1 = &a.相当于p1 = (void*)&a;
例题:建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无低于60分的,输出不及格的成绩。
解题思路:用malloc函数开辟一个自由区域,用来存5个学生的成绩,会得到这个动态域第一个字节地址,它的基类型是void型,用一个基类型为int的指针变量排来指向动态数组个元素,并输出他们的值,但不许先把函数返回的void指针转换成整形指针,然后赋给p1.程序如下:
1 #include2 #include 3 int main() 4 { 5 void check(int *); 6 int *p1; 7 //开辟动态内存区,将地址转换为int *型,然后放在p1中 8 p1 = (int *)malloc(5* sizeof(int)); //p1 = malloc(5*sizeof(int));也可以 9 for (int i = 0; i < 5; i++)10 scanf_s("%d",p1+i);//输入5个学生的成绩11 check(p1);12 return 0;13 }14 void check(int *p)15 {16 int i;17 for (int i = 0; i < 5;i++)18 if (p[i] < 60) printf("%d ",p[i]);19 printf("\n");20 }
程序分析:程序中没有定义数组,而是开辟了一段自由动态分配区,作为动态数组使用,在调用malloc函数时,没有给出具体的值,而是用5*sizeof(int),因为有5个学生的成绩,每个成绩是一个整数,但在不同系统中存放一个整数的字节不同,为了程序具有通用性,故用sizeof运算符测定在本系统中整数的字节数。