为什么要动态分配内存?什么时候需要动态分配内存?

问:为什么要动态分配内存

答1:因为内存太宝贵。

答2:如果全部是静止内存不能释放,对于小的程序可以运行完毕。但是对于大的程序,还没运行完,内存就要被占用完,此时就要发生内存泄露。

答3:给定一个占用内存可变大小的变量(假设是数组的长度len),给该变量通过函数动态分配内存后,分配内存的大小是根据数组的长度len决定的,假定用户输入len的大小是5,系统就会动态的给该数组分配长度为5的内存,该段代码运行结束后,系统调用free()函数释放分配的内存,然后接着运行剩下的程序。换句话说,动态分配内存可以根据需要去申请内存,用完后就还回去,让需要的程序用。

问:什么时候需要动态分配内存

答:当程序中有比较大的数据块需要使用内存的时候使用。原因:比较大的数据块如果使用了静态内存,在该数据块运行完毕后不能动态的释放该内存,直到整个程序运行完才能释放,如果整个程序比较大,有可能因为内存不够而发生错误。

问:难道不可以在该静态分配的内存使用完后,使用free()函数释放吗?

答:不可以,首先malloc() 函数和free()函数必须是配套使用,其次free()函数不能释放普通变量,只能释放指针。

问:什么时候需要动态分配内存(网友整理:https://blog.csdn.net/sinat_39085247/article/details/74356820

答:什么时候我们需要动态分配内存空间呢?举一个例子吧。int *p; 我们定义了一个指向int类型的指针p;p是用来储存一个地址的值的,我们之所以要为p这个变量分配空间是让它有一个明确的指向,打个比方吧!你现在做好了一个指向方向的路标,但是你并没有让这个路标指向一个确切的方位,也就是说现在的这个路标是瞎指向的,这样我们就不能够通过它来明确到底哪里是东,哪里是西,何为北,何为南了。虽然我们在计算机的内存里定义了一个指针变量,但是我们并没有让这个变量指示一个确切int类型变量的地址,所以我们就必须要让它有一个明确的指示方向。这样我们就要通过动态分配内存的方式来认为的规定它的方向!

     计算机内存的四大区域:栈区,常量区,全局区,堆区(动态分配)

  1. 栈   区:在栈里面储存一些我们定义的局部变量以及形参;
  2. 常量区:主要是储存一些字符常量;
  3. 全局区:在全局区里储存一些全局变量和静态变量;
  4. 堆       :堆主要是通过动态分配的储存空间;

以数组为例子来说明动态分配和释放内存

#include<stdio.h>
#include<malloc.h>
int main()
{
	int len;//定义数组的长度
	int *pArr=(int *)malloc(sizeof(int)*len);
	for(int i=0;i<len;++i)
		scanf("%d"\n,&pArr[i]);
	for(i=0;i<len;++i)
		printf("%d\n",*(pArr+i));
    free(pArr);  //pArr指向数组的首地址
    pArr = NULL;
    /*...
    剩余代码
    ...*/
	return 0;
	
}

问:为什么malloc函数前面需要int *的强制转换?

答:因为程序需要告诉编译器malloc函数返回值的第一个字节是int *类型的还是其他类型的。

1:代码中的malloch函数分配内存,在该段代码运行完后,通过free()函数释放,被释放的内存空间留着可以被剩余代码接着利用。

2:同时当我们使用malloc()函数的时候还应该注意当我们释放完空间的时候还要将原先的指针变量赋予一个NULL,也就是赋予一个空指针,留着下次的时候使用它!如果我们不赋予|NULL行不行呢??答案是:不行的!如果我们不赋予一个空指针这样会导致原先的指针变量成为了一个野指针,何谓野指针?野指针就是一个没有明确指向的指针,系统不知道它会指向什么地方,野指针是很危险的,因此当我们每次使用完malloc()函数的时候都必须将指针赋予一个空指针!

  • 54
    点赞
  • 206
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值