动态内存空间分配
动态内存空间分配是指,在程序运行期间,根据实际需要向系统申请一定大小的内存空间,使用指针变量存储这块内存空间的地址,通过指针变量访问内存空间中的数据。变量使用完成后,要将动态申请到的内存空间归还给系统。
C语言对内存的动态分配是通过库函数实现的,主要有malloc,calloc、fe和 realloc 4个函数。这些函数在stdlib.h头文件中声明。
(1) malloc函数,其函数原型为:
void *malloc( unsigned int size)
其作用是向系统申请分配一个长度为size的连续内存空间。函数的返回值是内存空间的起始地址,如果未能成功分配到内存空间,则返回值为NULL。
(2) calloc函数,其函数原型为:
void *calloc(unsigned int n, unsigned int size)
其作用是向系统申请分配n个长度为size的连续内存空间。函数的返回值是内存空间的起始地址,如果未能成功分配到内存空间,则返回值为NULL。
(3)free函数,其函数原型为
void free(void *p)
其作用是释放指针变量p指向的内存空间,即将内存空间归还给系统,以便可以被程序中的其他部分使用,无返回值。指针变量p中的地址应该是使用malloc或calloc申请的内存空间的地址。
(4)realloc函数,其函数原型为:
void * realloc(void *p, unsigned int size)
其作用是对通过 malloc或calloc申请的内存空间进行重新分配,通常是为了改变原来申请内存空间的大小。参数p指向原来分配的内存空间,size表示重新分配的内存空间大小。
上面4个函数的参数和返回值使用了“void *”指针类型,该类型的指针变量存储一个“纯地址”,即只表示内存地址的编号,而不表示地址的类型。void类型指针与其他类型指针之间进行相互赋值时,无需强制类型转换,编译系统会自动进行转换。但习惯上,void指针赋值给其他类型指针时,使用强制类型转换。
动态申请内存空间时,通常使用运算符 sizeof计算不同类型的数据占用的字节数。
例如,动态分配存放10个int类型数据的内存空间,可以使用如下两种方式
int *p;
p=(int *) malloc(10*sizeof(int);//使用malloc函数分配
p=(int *) calloc(10,sizeof(int);//使用 calloc函数分配
程序中不再使用分配到的内存时,应该释放占用的内存空间,例如:
free(p);∥释放p指向的内存空间
例:利用动态数组存储多个考试成绩,输出其中不及格的成绩。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *list,*p,n;
printf("输入考生人数:");
scanf("%d",&n);
list=(int *)calloc(n,sizeof(int));
printf("输入[%d]个考生成绩:",n);
for(p=list;p<list+n;p++)
scanf("%d",p);
printf("不及格的成绩有:");
for(p=list;p<list+n;p++)
{
if(*p<)
printf("%d ",*p);
}
printf("\n");
return ;
}
程序运行结果: