动态内存分配(介绍和使用方法)
动态内存分配介绍
动态内存分配,顾名思义就是可以使我们更加灵活的分配和运用内存,动态内存的开辟的释放都是按照我们自身的需要进行的,我们通常直接使用的内存是在栈上的,开辟和释放内存都是由系统自动进行的,而动态内存分配的内存是在堆上。
那么使用动态内存的好处在哪?
在堆上开辟的内存,不会被系统自动释放,只能通过我们自己释放或者当程序结束的时候被自动回收,只要我们有指向由我们申请在堆上的空间的指针,我们就能对它进行修改数据和使用。
动态内存分配有关函数介绍
malloc
介绍:malloc函数作用是向堆申请空间
函数原型:void* malloc(size_t size)
void* malloc(想要向堆申请的内存空间大小,单位为字节) size_t等于int
特点:申请的空间不会被初始化
如果申请空间失败会返回空指针
calloc
介绍:calloc函数作用也是直接向堆申请空间
函数原型:void* calloc(size_t num,size_t size)
num:元素个数 size:元素类型大小
特点: 申请的空间会被初始化
如果申请空间失败会返回空指针
realloc
介绍:realloc函数可以调整在堆上的的空间大小
函数原型:void* realloc(void* p,size_t size)
p:在堆上空间的首地址 size:想要调整成的内存大小,单位为字节
特点:
一:申请的空间不会被初始化
二:如果申请失败会返回空指针
三:开辟成功,返回原来的地址,也可能返回新地址,因为要调整的空间的后面可能不够空间申请,因此要将整个原来的空间拷贝到新的地方进行调整,然后释放原来的空间内存,返回新地则
free
free函数用来释放内存
函数原型:void free(void* p)
p的值可以为NULL,free可以判断p是不是空指针
常见错误:
一:在申请堆上空间的时候,可能会申请失败而返回NULL,所以要先判断返回值是不是为空指针再赋值给指针变量
二:越界访问了堆上的内存
三:使用free释放非动态内存的空间
四:使用free释放一部分动态内存的空间
五:对同一块空间多次释放
六:长时间不使用堆上空间不释放,或者忘记释放。