1.malloc();创建内存
例如创建n个整型单元
int*p=(int*)malloc(n*sizeof(int))
如果要将创建十个整型单元并且全部赋值为0,即运用一个for()循环:
int*p=(int*)malloc(10*sizeof(int));
for(int i=0;i
{
p[i]=0;
}
则可以引入:
2.calloc();赋值为0
即上述可直接更换为: int*p=(int*)calloc(10,sizeof(int));
在使用过程中发现p长度不够用,需要20个整型单元,即
int *p = (int *)malloc(10*sizeof(int));
for(int i=0;i<10;i++)
{
p[i] = i;
}
for(int i=0;i<10;i++)
{
p[i] = i;
}
int *q = (int *)malloc(20*sizeof(int));
for(int i=0;i<10;i++)
{
q[i] = p[i];
}
for(int i=0;i<10;i++)
{
q[i] = p[i];
}
free(p);
p = q;
q = NULL;
free(p);
p = q;
q = NULL;
free(p);
则此时可以引入:
3.realloc();扩容
即上述可直接更换为:
int *p = (int *)malloc(10*sizeof(int));
for(int i=0;i<10;i++)
{
p[i] = i;
}
printf("%d\n",p);
p = (int *)realloc(p,10*sizeof(int));
printf("%d\n",p);
for(int i=0;i<10;i++)
{
p[i] = i;
}
printf("%d\n",p);
p = (int *)realloc(p,10*sizeof(int));
printf("%d\n",p);
创建动态数组:利用malloc创建内存,利用free释放内存,如果没有释放,则出现内存泄露则可用内存越来越少,设备速度越来越慢;
动态内存最大的问题及为内存泄露,即引入:
4.free();用来释放申请的内存
而free();有时候会出现崩溃,崩溃有以下三个原因:
一越界:(破坏了尾)
int *p = (int *)malloc(10);//越界
for(int i=0;i<10;i++)
{
p[i] = 0;
}
free(p);
for(int i=0;i<10;i++)
{
p[i] = 0;
}
free(p);
二指针的指向移动(破坏了头)
int* p = (int *)malloc(10*sizeof(int));
for(int i=0;i<10;i++)
{
*p = 0;
p++;//p的位置发生了移动
}
free(p);
{
*p = 0;
p++;//p的位置发生了移动
}
free(p);
三重复释放同一段内存:
例如在扩容的事例中:
int *p = (int *)malloc(10*sizeof(int));
for(int i=0;i<10;i++)
{
p[i] = i;
}
int *q = (int *)malloc(20*sizeof(int));
for(int i=0;i<10;i++)
{
q[i] = p[i];
}
for(int i=0;i<10;i++)
{
p[i] = i;
}
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);
free(q);//重复释放
p = q;
q = NULL;
free(p);
free(q);//重复释放