使用动态内存的原因:
(1)栈内存小(1M)
(2)根据变量定义数组长度
在创建代码的过程中,我们经常会用到动态内存。动态内存的几个关键函数,它们分别是malloc、calloc、realloc和free。
创建内存:
·malloc 最为常用
·calloc 将每一个元素置0
·realloc 修改内存的大小
释放内存:
·free 不释放则会出现内存泄露
动态内存分配的空间在堆,堆很大,最大能分配的连续块1.8G左右。
- 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;
这样就不会出现内存泄漏了。
- calloc函数的作用是申请动态内存并将数组中的元素初始化为0。
int *p = (int *)calloc(n,sizeof(int));
动态创建n个长度整形数组,并将整形数组的初始化都置为0,这一句就代表上面的malloc函数创建的内存。同样,在使用完realloc函数之后都要用free释放内存。
- 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函数来扩大内存。
- free函数的作用是释放内存。如果申请内存使用完毕后不及时释放旧的内存,就会产生内存泄漏现象,造成可用的内存越来越少。
泄漏的内存自动返还:
(1)程序(进程)退出
(2)关机(重启)
free崩溃的原因:(本质修改,丢失内存的头或者尾信息)
(1)数组越界(修改了尾信息)
(2)移动动态内存的地址(丢失头信息)
补充
栈:空间小,由操作系统管理内存。包括分配、回收。
堆:空间大,由程序员自行管理,一定注意内存回收。