动态内存:动态创建内存,创建大内存
在Windows中,堆中最大的连续内存大概1.3G左右
一、申请
1.malloc(当我们需要在堆中申请一块连续且指定大小的内存块时的内存时,我们可以使用动态内存。)
参数:size(分配的字节)
需要的头:<stdlib.h>和<malloc.h>
使用:指针类型+变量名=(指针类型)+malloc+(n*sizeof(数据类型));
例如:int main()
{
int n=10;
int *p=(int*)malloc(n*sizeof(int)); //动态创建内存 //int p[n]
free(p);
return 0;
}
malloc 有两个兄弟 calloc(自动置零) 和 realloc(扩容)
现在我们就来说说这两个函数
2.calloc
两个参数:(1)num 元素的数目
(2)size 字节长度
必须的头:<stdlib.h>和<malloc.h>
//calloc的使用
int *p=(int*)calloc(a,sizeof(int));
下面的等同于calloc
int *p=(int*)malloc(a*sizeof(int));
for(int i=0;i<a;i++)
{
p[i]=0;
}
分配内存中的一个数组的元素初始化为0。
3.realloc
重新分配内存块。
两个参数:(1)memblock 对以前指定的指针内存块
(2)size 新的大小(以字节为单位)
int main()
{
int *p = (int *)malloc(10*sizeof(int));
printf("%d\n",p);
for(int i=0;i<10;i++)//模拟p被使用
{
p[i] = i;
}
//p = (int *)realloc(p,5*sizeof(int));
//printf("%d\n",p);
//下面等同realloc
/*
int *q = (int *)malloc(20*sizeof(int));
for(int i=0;i<10;i++)
{
q[i] = p[i];
}
free(p);
p = q;
q = NULL;*/
free(p);
return 0;
}
二:释放
调用free()函数 //释放内存
//申请动态内存缺少释放过程会导致:
①:内存泄漏问题(手机变卡)
②:内存碎片问题
//最大问题:内存泄漏
//free崩溃的原因
//1、越界
//2、指针移动,找不到头
//3、重复释放内存
//4、释放不是动态创建的内存
/*//free崩溃的第四个原因:释放不是动态创建的内存
int main()
{
int a = 10;
free(&a);
return 0;
}
*/
/*free崩溃的第三个原因:重复释放内存
int main()
{
int *p = (int *)malloc(10*sizeof(int));
int *q = p;
free(p);
free(q);
return 0;
}
*/
/*
//free崩溃的第二个原因:指针移动
int main()
{
int *p = (int *)malloc(10*sizeof(int));
for(int i=0;i<10;i++)
{
*p = 0;
p++;
}
free(p);
return 0;
}
*/
/*free崩溃的第一个原因:越界
int main()
{
int *p1 = (int *)malloc(20);
for(int i=0;i<20;i++)
{
p1[i] = 0;
}
free(p1);
return 0;
}
*/