在我们使用很多函数要申请变量空间时,比如像筛选素数,根据题目筛选范围的不同,变量数不同,这是我们如果通过以下方法都会有错误:
void SiftPrime()
{
int arr[n];//错误,数组长度不能为变量
int arr[100];//错误,如果筛选范围为1000,会越界,空间大小不合适
}
这些办法都不行,所以我们要申请动态内存来解决未知变量个数申请空间的问题,动态内存申请使用malloc、calloc、realloc
malloc的使用率远高于calloc,它与calloc最大的区别在于它会自动把每个元素初始化为0。
①malloc只有一个参数,即要分配的字节数。malloc申请的是连续的动态内存,可以当作数组使用。
int *arr=(int *)malloc(a*sizeof(int));//乘以sizeof就是计算出字节数
char *brr=(char *)malloc(b*sizeof(char));
②calloc两个参数,参数1为要申请元素的个数,参数2为每个元素的长度
int *arr=(int *)calloc(a,sizeof(int));
char *brr=(char *)calloc(b,sizeof(char));
③realloc也有两个参数,参数1为原来的内存,参数2为新的字节数。一般用于内存不够之后扩展内存:
arr=(int *)realloc(2*a*sizeof(int));
注:扩大内存后,一定要更新地址
动态分配的内存有头和尾的信息(自动在每个内存的前后加信息,这部分信息是隐藏的)。前面的信息包括该内存的大小,后面的信息可以使碎片内存被释放后可以拼接成整块。
在申请了动态内存使用以后要进行内存释放,不然会造成内存泄露,内存释放使用free函数,它有一个参数,为需要释放内存的地址,它的头文件为<vld.h>。
free释放内存时可能会崩溃,崩溃的原因主要有四点:(出现的几率与排序一致)
①越界(越界之后把尾信息丢掉了)
♢malloc漏写了sizeof
♢realloc第二个参数为新的字节总长度,写成了刚增加的字节长度
②改变了指针的指向,(p++)→++把首地址改了
③重复释放内存
④释放的不是动态申请的内存