动态内存:malloc,calloc,realloc,free
malloc(创建动态内存)
我们用一道课后题目来做解释:
//求n以内的素数
void SiftPrime(int n)
{
int *p = (int *)malloc(n*sizeof(int)); //创建动态内存
assert(p != NULL);
if(p == NULL)
{
return ;
}
int i;
for(i=0;i<n;i++)
{
p[i] = 1;
}
p[0] = 0;
p[1] = 0;
for(i=2;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(j%i == 0)
{
p[j] = 0;
}
}
}
for(i=0;i<n;i++)
{
if(p[i] == 1)
{
printf("%d\n",i);
}
}
//free(p);//释放内存
}
calloc:在动态内存的存储区分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;分配不成功时则返回NULL。
如:
(1)使用malloc时
int main()
{
int*p=(int *)malloc(10*sizeof(int)); //将p中的每个单元格置为0
for(int i = 0; i<10; i++)
{
p[i] = i; //模拟p的使用过程
}
}
(2)使用calloc时
int*p=(int*)calloc(10,sizeof(int)); //动态开辟内存,并且将每个单元格置为0
realloc(扩大原先的动态内存)
如:P=(int*)realloc(p,80); // 将p的容量扩大到2倍
内存泄漏:可以通过内存测试工具进行检测
free(释放内存)
崩溃原因:
1、越界2、指针移动
3、重复释放同一段内存
4、释放栈内存