动态数组:将指针与动态内存分配函数联用。
动态内存分配:在程序运行时为变量分配内存的一种方法。
C语言的动态内存分配函数从堆上分配内存,只用这些函数的时候需要将头文件<stdlib.h>包含到源程序中。
1、malloc()函数
函数原型:void *malloc(unsigned int size);
malloc()函数用于分配若干字节的内存空间,返回一个指向该内存首地址的指针。若系统不能够提供足够的内存单元,函数会返回空指针NULL。
size:向系统申请空间的大小,函数调用成功会返回一个指向void类型的指针。
void *:常用来说明其基本类型未知的指针。如果要将函数调用的返回值赋给某个指针,就需要用强制类型转换将返回的指针转为所需要的类型,然后再进行赋值操作。
例:
int *p = NULL;
p = (int *)malloc(10);
不同的类型在不同的编译器、系统下面在内存中会占有不同的字节数,所以我们一般会采用sizeof()来计算本系统中该类型所占內存的字数,然后才用malloc()向系统申请相应字节数的储存空间。
例:p = (int *)malloc(10*sizeof(int));
2、calloc()函数
函数原型:void *calloc(unsigned int num,unsigned int size);
calloc()函数用于给若干同一类型的数据项分配连续的储存空间并赋值为0;相当于声明了一个一维数组;数组返回值为数组首地址;
num:表示向系统申请的内存空间的数量,决定了一位数组的大小
size:表示申请的每个空间的字节数,确定了元素类型
如果要将函数调用的返回值赋给某个指针,就需要用强制类型转换将返回的指针转为所需要的类型,然后再进行赋值操作;
例:
int *p = NULL:
p = (int *)calloc(10,sizeof(int));
相当于
int p = (int *)mcalloc(10*sizeof(int));
calloc()比malloc()更加安全,因为calloc()函数能自动将内存初始化为0;
3、free()函数
函数原型:void free(void *p);
free()函数是释放向系统动态申请的储存空间;
p只能是由malloc()和calloc()申请内存时返回的地址;
例:free(p);
4、realloc()函数
函数原型:void *realloc(void *p,unsinged int size);
realloc()函数用于改变原来分配的储存空间的大小;
将原来p指向的储存空间的大小改为size个字节,返回新分配的储存空间的首地址,与原分配的首地址不一定相同。
例:realloc(p,15);
5、例
例:
#include <stdio.h>
#include <stdlib.h> //头文件
double aver(int *p,int num){
int sum = 0;
for(int i = 0;i < num;i++){
printf("输入%d个数字:",i+1);
scanf("%d",&p[i]);
}
for(int i = 0;i < num;i++)
sum += p[i];
return (double)sum/num;
}
int main(){
int *p = NULL,num;
double average;
printf("输入数字个数:");
scanf("%d",&num);
p = (int *)malloc(num*sizeof(int)); //向系统申请空间
if(p == NULL){
printf("空间不足\n");
exit(0);
}
printf("average:%f\n",aver(p,num));
free(p); //释放空间
return 0;
}