1.引入
为了更加灵活的申请和释放空间,由此引入了动态内存分配
2.malloc和free
这两个函数都声明在 stdlib.h 头⽂件中。
2.1malloc
函数原型:void* malloc (size_t size)
使用:指针先初始化,再分配,分配完检查是否分配成果,若为NULL则分配失败
int* ptr = NULL; ptr = (int*)malloc(num*sizeof(int)); if(NULL!=ptr){ ··· }
作用:向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针
注意:
1.若开辟成功,则返回该开辟好空间的指针
2.失败,则返回一个 NULL 指针,所以要检查
3.开辟空间类型,由使用者自己决定
2.2 free 函数
作用:专门用来做动态内存的释放和回收的
函数原型:void free (void* ptr);
使用:释放空间后一定要重置指针,否则会变成野指针
free(ptr); ptr = NULL;
要求:
1.参数ptr指向的空间要是动态开辟的
2.若参数ptr 是NULL指针,则函数无用
3. calloc和realloc
3.1 calloc
作用:为num个大小为size的元素开辟一块空间,进行动态内存分配,并且会把空间内的每个字节初始化为0(和malloc的区别)
函数原型:void* calloc (size_t num, size_t size);
使用:因为calloc会初始化,所以不用单独初始化指针,只需判断是否分配成功即可
int *p = (int*)calloc(10, sizeof(int)); if(NULL != p){ ··· }
3.2 realloc
作用:对动态开辟内存大小的调整
函数原型:void* realloc (void* ptr, size_t size);
解释:
1.ptr是要调整的内存地址,size 调整之后新⼤⼩
2.返回值为调整之后的内存起始位置
3.调整原空间得同时,原内存数据也会迁移到新空间
4.常见的动态内存的要求
1.引用指针*p时 要先判断p的值不是NULL
2.对于动态开辟空间 不要越界访问
3.只有动态开辟的空间,才能使用函数free进行释放,而且不可多次释放
4.free函数释放后 要重置指针 赋值为NULL,否则会变成野指针
5.开辟完动态空间后也要记得释放!