【C解析之八】 动态内存管理

             

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为指向开辟空间的指针
  •            返回值:无返回值。
下面是malloc()与free()使用的示例
#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;
}

     
     
    
    
           4.动态内存管理的优势
            所谓动态内存管理,也指它能动态地满足对内存空间的需求。在很多情况下,我们并不知道该需要多少空间才能满足要求,比如记录班级学生成绩,有的班级人数多,有的则少,如果定义的数组过大则浪费了内存,过小则会出问题,这种情况下采用动态内存管理的方法,根据不同班级的人数开辟相应大小的空间,会让程序丝毫内存也不浪费。
            链表或许是动态内存管理最佳释义,详见【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
      
      
     
     
    
    


                            
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值