头文件:<stdlib.h>
malloc:(申请字节数)
malloc(n*sizeof(int)); //申请n个int类型的内存
int *p = (int *)malloc(n*sizeof(int)); // == int p[n] 强转
calloc:与malloc相比多了“置0”这个动作
int main()
{
/*//如下操作等同calloc
int *arr = (int *)malloc(10*sizeof(int));
for(int i=0;i<10;i++)
{
arr[i] = 0;
}*/
int *arr = (int *)calloc(10,sizeof(int));// 0 0 0 0 0 0 0 0 0 0
return 0;
}
realloc:内存扩容,对已有内存进行扩充
int main()
{
int *p = (int *)malloc(10*sizeof(int));
p = (int *)realloc(p,20*sizeof(int));
printf("%d\n",p);
/*//下面的代码等同realloc
int *q = (int *)malloc(20*sizeof(int));
for(i=0;i<10;i++)
{
q[i] = p[i];
}
p = q; //将q所有值赋给p,方便使用
q = NULL; //q置空 */
return 0;
}
free:释放内存防止内存泄漏 (free在释放时,不需要内存长度,是因为free有头和尾信息!)
free崩溃的原因:1.越界 [ 漏*sizeof ] [ realloc参数错误 ]
2.修改了指针的指向 [ p++ ]
3.重复释放同一段内存
4.释放非动态内存
错误示例:
int main()//free崩溃情景1
{
int *p = (int *)malloc(10*sizeof(int));
for(int i=0;i<=10;i++) //申请了10个内存,分配了11个数字
{
p[i] = 0;
}
free(p);
return 0;
}
int main()//情景2
{
int *p = (int *)malloc(10*sizeof(int));
for(int i=0;i<10;i++)
{
*p = 0;
p++; //error//free有头和尾信息,p++会导致指向错误
}
free(p);
return 0;
}
申请内存用完之后,一定要记得释放内存!