动态内存

使用动态内存的原因:
(1)栈内存小(1M)
(2)根据变量定义数组长度
在创建代码的过程中,我们经常会用到动态内存。动态内存的几个关键函数,它们分别是malloc、calloc、realloc和free。

	创建内存:
		·malloc   最为常用
		·calloc	  将每一个元素置0
		·realloc   修改内存的大小
	释放内存:
		·free   不释放则会出现内存泄露

动态内存分配的空间在堆,堆很大,最大能分配的连续块1.8G左右。

  1. malloc函数的作用是专门用于申请内存的。这个函数需要一个参数n*sizeof(int),表示需要开辟的内存的大小。
	int *p = (int *)malloc(n*sizeof(int));//它类似于int p[n];
	for(int i=0;i<n;i++)//模拟数组被使用
	{
		p[i] = 0;
	}
	printf("%d\n",p);
  动态创建n个长度的整形数组,然后进行数组被使用将每个单元置为0。如果内存不够使用需要扩大内存,还需将原来的数据复制到新内存中。如:
	//新开辟原来2倍的内存
	int *q = (int *)malloc(2*n*sizeof(int));
	//复制原来的数据到新内存
	for(int i=0;i<n;i++)
	{
		q[i] = p[i];
	}

通过完成上面的创建内存之后,千万不要忘记释放内存。

	free(p);//释放原内存
	p = q;
	q = NULL;

这样就不会出现内存泄漏了。

  1. calloc函数的作用是申请动态内存并将数组中的元素初始化为0。
	int *p = (int *)calloc(n,sizeof(int));
动态创建n个长度整形数组,并将整形数组的初始化都置为0,这一句就代表上面的malloc函数创建的内存。同样,在使用完realloc函数之后都要用free释放内存。
  1. realloc函数的作用是修改内存空间的大小,进行扩容。
	int n = 1024*1024;
	int *p = (int *)malloc(n*sizeof(int));
	for(int i=0;i<n;i++)//模拟数组被使用
	{
		p[i] = i;
	}
	printf("%d\n",p);
	//长度不够,需要扩大2倍
	p = (int *)realloc(p,2*n*sizeof(int));
	printf("%d\n",p);

	free(p);
在使用malloc创建内存,所需要的长度不够可以使用realloc函数来扩大内存。
  1. free函数的作用是释放内存。如果申请内存使用完毕后不及时释放旧的内存,就会产生内存泄漏现象,造成可用的内存越来越少。

泄漏的内存自动返还:
(1)程序(进程)退出
(2)关机(重启)
free崩溃的原因:(本质修改,丢失内存的头或者尾信息)
(1)数组越界(修改了尾信息)
(2)移动动态内存的地址(丢失头信息)

补充
栈:空间小,由操作系统管理内存。包括分配、回收。
堆:空间大,由程序员自行管理,一定注意内存回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值