malloc是动态内存分配时最长用到的函数之一,是在堆(heap)上来申请一段连续的内存,用来计算你要申请分配的内存大小。
以int类型来举例,常见格式为:int *p=(int *)malloc(40);
如果与sizeof结合起来可以这样写:int *p=(int *)malloc(10*sizeof(int));
malloc函数所需的头文件为malloc.h或stdlib.h,返回值为void*类型,当其返回为void时证明内存申请失败,而它可申请的最大内存一般不会超过2G,但也会因电脑而异。申请完之后应进行断言,看内存在堆上申请是否成功,如果申请成功编译器会返回所申请的内存大小。
使用完这块内存之后应该进行手动释放,释放时需用到free函数
free(p); //不释放会导致内存泄漏 检测内存泄漏时应该加入vld.h头文件
p=NULL; //不置空可能会出现野指针
申请内存的时候,部分人可能会使用了malloc也释放了也置空了,但是运行的时候往往会出bug。
申请一般情况下语句写好是没有问题的,所以问题一般都出释放(free)上。
free()崩溃的原因主要有:
①指针进行移动 如果指针进行转移,比如p++了或者p--了,都会崩溃
②重复释放同一块内存 这个比较好理解 如果同一块内存释放两次及以上都会崩溃。
③越界 访问超过你所申请的内存大小会崩溃
④释放不是动态申请的内存 如果你将*p指向一个变量或任何非动态申请的内存,都会崩溃。
与malloc相关的函数主要有:
calloc() 默认值为0 用法与malloc相同
realloc() 默认值为随机值 用法: int *p2 = (int *)realloc(p,15*sizeof(int))
assert(p2 != NULL);
free(p2);
p2=NULL;