一.为什么存在动态内存管理:
我们知道,在此之前向内存申请空间的方式有以下两种:(变量和数组)
但这两种方法有几个缺陷:
①:空间开辟大小是固定的;
②:数组在声明的时候,必须指定数组的长度,它所需要的内存在编译时分配;
但是由于空间的需求,不仅仅是上述两种情况,有时候我们需要的空间大小在程序运行的时候才知道,那数组的编译时开辟空间的方式就不合适了。
假设数组大小为100,但有101个元素就塞不下;只有10个元素又太浪费空间了。
所以这时候只能试试动态分配了。
二、动态内存函数的介绍:
1.动态开辟函数——malloc函数
1.1.函数声明和作用:
void* malloc (size_t size);
①:函数作用:向内存申请一块可用的连续的空间,返回值为这块空间的起始地址;
②:函数参数:类型为size_t,即该函数一次申请size个字节的空间,但不会初始化该空间内容,如果size==0,那么malloc的行为是未定义的,取决于编译器;
③:返回值是void*,返回规则如下:
④:该函数包含头文件<stdlib.h>中。
⑤:动态内存函数申请空间都是在堆区上面申请,如下图:
1.2.函数使用实例:
#include<stdio.h> #include<stdlib.h> int main() { //要什么类型的空间,就用什么类型的指针接收 //注意函数返回值为void*,所以记住强制类型转换 int* p = (int*)malloc(40); //判断申请空间是否成功 if (p == NULL) { perror("malloc");//打印申请失败的原因 return 1; } //使用空间 int i = 0; for (i = 0; i < 4; i++) { p[i] = i; printf("%d ", p[i]); } return 0; }
2.释放动态空间函数——free函数
注意:这些动态开辟函数申请内存空间,当程序退出时,会还给操作系统,但当程序不退出,动态开辟的内存不会主动释放,这时就需要用到函数free()来释放。
2.1.free函数注意事项:
、
①:函数声明:
void free (void* ptr);
②:该函数包含在头文件<stdlib.h>中。
2.2.free函数使用实例:
该函数使用方法非常简单,参数只需要给动态开辟的变量即可,如下:
这里值得注意的是,free函数释放空间后,不会改变指针p的值,所以此时p还是指向这块空间,但该空间已被释放,所以此时p是野指针,所以我们要把p指针置空。