C语言中,变量采用“先定义后使用”的原则,变量一旦被确定,其内存地址及存储的数据类型就确定了。
当需要动态数组类型时,可以使用内存管理函数按需要动态的分配内存空间,也可以把不再使用的空间回收待用,有效利用内存资源。
void 类型指针
①一些标准函数的返回值是无类型指针,例如动态内存分配函数 malloc 的返回值,使用时需要将无类型指针强制转换为其他类型的指针。
(数据类型 *)无类型指针变量名
②如果一个函数的形式参数被定义为无类型指针,则在用实际参数调用该函数时,不需要对实际参数进行强制转换。
动态内存分配和释放函数
分配内存空间函数malloc
void * malloc (unsigned int size)
函数调用形式:
(类型标识符 *)malloc(size)
“类型标识符”表示把该区域用于何种数据类型,(类型标识符 *)表示把返回值强制转换为该类型的指针,size是一个无符号整数
函数功能:在内存的动态存储区中分配一块长度为size字节的连续区域,函数的返回值为该区域的首地址。
例如:
char *pc;
pc=(char *)malloc(100);
表示分配100个字节的内存空间,并强制转换为字符型指针,函数的返回值为该内存空间的首地址,并把该地址赋予指针变量pc,若申请失败返回则pc=NULL
实际上,这里用malloc函数实现了动态分配一个数组。
释放内存空间函数free
void free(void *ptr)
函数调用形式:
free(ptr)
函数功能:释放ptr所指向的一块内存空间,ptr是一个void类型的指针变量,它指向被释放区域的首地址,被释放区必须是malloc或calloc函数所分配的区域
例:内存的动态分配和释放
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,n,*p;
float ave,sum=0;
scanf("%d",&n); //输入学生人数
p = (int *)malloc(n*sizeof(int)); //向系统申请n个sizeof(int)字节的连续存储空间
if(p==NULL)
printf("No enough memory\n");
else
{
for(i=0;i<n;i++)
{
scanf("%d",p+i);
sum+=*(p+i);
}
}
ave=sum/n;
printf("the average is %.2f\n",ave);
return 0;
}