C解析之八动态内存管理
前言:动态内存管理,C/C++迷人的魅力所在,只因,它可以让你对计算机的操控上升到近乎无限的程度。
动态内存管理和指针,实现C/C++对内存的精准操控,这一特征让C/C++程序在空间消耗上的表现异常突出,一定层面上可以解释为什么C是底层系统开发语言的首选。大到操作系统任务,小到一个通讯录,都可以发现动态内存管理,如果你深入研究还会发现,动态内存管理发挥的作用无可替代。
1.动态内存管理与指针:
动态内存管理的主要函数malloc() / free()都需要指针的支持,关于指针可阅读【C解析之四】指针。C语言的内存分配机制(【C解析之三】C语言的内存分配)告诉我们,动态空间的申请是在堆区,malloc函数申请空间,free函数用于释放。
指针扮演一个什么样的角色?存储在静态区的全局变量与静态变量,栈区的局部变量(关于局部变量【C解析之五】函数:你不知道的事有相关的介绍)等都是先声明定义后使用,换句话说,这些变量都有名称,类型,通过名称可以使用这些变量。但在堆区通过动态分配申请的空间是没有名称,也没有类型的,通过指针利用这些空间似乎是唯一的选择。同时,申请的空间没有指定类型,赋值给指针之前需要强制转换。理解这两点就不难理解函数原型了,如下:
2.malloc()开辟指定大小的存储空间:
- 用法:malloc(int size) ,size为需要开辟的字节数。
- 返回值:开辟空间的首地址。
3.free()
空间释放内存空间:
- 用法:free(void *p) , p为指向开辟空间的指针
- 返回值:无返回值。
#include
#include
int main(){
int * p; //定义一个int行指针
p=(int *)malloc(20); //开辟20个字节的地址
//20个字节可以存4个int型变量哦
printf("请输入4个数字存入开辟空间:\n");
for(int i=0;i<4;i++){
scanf("%d",&p[i]);
}
printf("显示存储在开辟空间的数字:\n");
for(i=0;i<4;i++){
printf("%d\n",p[i]);
}
free(p); //释放空间
return 0;
}
所谓动态内存管理,也指它能动态地满足对内存空间的需求。在很多情况下,我们并不知道该需要多少空间才能满足要求,比如记录班级学生成绩,有的班级人数多,有的则少,如果定义的数组过大则浪费了内存,过小则会出问题,这种情况下采用动态内存管理的方法,根据不同班级的人数开辟相应大小的空间,会让程序丝毫内存也不浪费。
链表或许是动态内存管理最佳释义,详见【C解析之九】链表。
下面是动态分配内存记录班级成绩并显示平均成绩的示例:
#include
#include
int main(){
int StudentNum; //记录班级人数
int Score=0; //记录平均成绩
int * p; //定义一个int行指针
printf("请输入班级人数:\n");
scanf("%d",&StudentNum);
p=(int *)malloc(StudentNum * sizeof(int)); //开辟StudentNum个int空间
printf("请输入%d个同学成绩:\n",StudentNum);
for(int i=0;i