对于 指针,正确的分配动态 内存是十分重要的,本文将着重阐述动态内存分配函数malloc,calloc,realloc的用法。
1.对于malloc
作用是在 内存的堆区分配一个大小为size的连续空间,如果分配内存成功,函数返回新分配内存的首地址,否则,返回 NULL,注意:鉴于上述这点,一般在写程序需要判断分配内存是否成功。
//栈的大小为1M,可配
//堆能分配的最大的分配空间为1.2G
内存是连续的,只有一个参数
我们进行一个测试:
int *arr=(int*)malloc(1024*1024*1024*1.2) //1.2G
intint *arr=(int*)malloc(1024*1024*100) //100M
此时的内存为为1.3G,没有崩溃
但是:
int *arr=(int*)malloc(1024*1024*1024*1.3) //1.3G
此时系统崩溃 了,因为内存分配需要的是连续的空间,不会在第一种情况下不会崩溃是因为那100M是内存碎片,并不连续,所以可以;但第二种是需要连续的1.3G,内存不够,所以崩溃了。堆能分配的内存为这么多,大家以后自己在申请内存的时候一定要注意。
2.对于calloc
int a=10;
int*arr=(int*)calloc(a*sizeof(int))
for(it i-=;i<n;i++)
{arr[i]=0;}
一般不多用,会自动的把每一格置0
如果要扩充容量为2倍
int *brr=(int*)malloc(2*a*sizeof(int))
for(int i=0;i<a;i++)
{brr[j]=arr[i];}
arr=brr;
brr=NULL;
3.对于realloc
int *arr=(int*)malloc(a*sizeof(int))
for(int i=0;i<a;i++) //模拟arr被使用
{arr[i]=i*10;}
malloc、colloc、realloc 三个函数都有内存泄漏:因为申请了内存,在使用过程中,并没有被释放掉,所以就会有泄漏
解决泄漏的方法:关闭程序或者设备关闭
防止内部泄漏:要释放内存,使用 free()
动态分配的内存:有头和尾信息
free()有时候会崩溃,原因有很多:
1.越界:
i:漏掉sizeof,
ii:扩大容量时:会用realloc(第二个参数)
2.动态内存中,不能移动位置,没有指向头信息,改变了指针方向
3.重复释放内存
4.释放了不是动态内存的内存 //一般不常用