Bootstrap

【C语言】动态内存管理

一、为什么存在动态内存管理

在之前数组的学习过程中,我们知道,数组是在编译时开辟空间,但是程序运行之后所需要的空间的大小我们是不可知的,因此我们需要用到动态内存开辟,进行动态内存管理是为了尽量避免内存安全问题的出现。

二、动态内存函数的介绍

1、malloc

函数的简述

void* malloc (size_t size)

函数的返回值为void*,函数的参数为无符号整形即将要开辟空间的大小(单位是字节)
当用malloc函数进行动态内存开辟空间成功时,返回其所开辟空间的首地址;
当用malloc函数进行动态内存开辟空间失败时,返回NULL

注意事项
进行malloc开辟空间后进行判断
使用malloc函数进行开辟的空间,当这片空间使用完成后,一定要记得用free函数释放掉
释放掉后将释放掉的指针置空

函数的声明:#include<stdlib.h>

函数的使用

养成使用malloc函数开辟空间进行判断的习惯,增强代码的健壮性

2、free

函数的简述

void free(void*ptr)

将malloc函数开辟的内存进行释放,释放是指将将malloc函数开辟的空间还给操作系统,防止内存泄漏

思考:free函数是如何做到精准释放的

当我们使用malloc开辟40个字节的空间时,实际开辟的是44个字节,其中前四个字节存放的是一个整形变量,用于记录开辟的大小

3、calloc

函数简述

void*calloc(int num,size_t size)

向内存中申请num个,大小为size个的空间然后初始化为0

注意事项:
使用完calloc开辟后的空间也需要用free进行释放
然后再将其置空

函数的使用

4、realloc

函数的简述

void * realloc ( void*ptr,size_t size )

relloc函数用于空间的动态调整,将已经开辟好由 ptr 指向的空间进行扩容size个字节,用于malloc进行开辟的空间过小不够用时及时对空间进行调整
理解易错点:是扩容到size个字节,而不是扩容size个字节,一字之差,天壤之别

函数的使用

realloc开辟空间的两种情况

情况一:malloc 或者 calloc 开辟的空间后紧接着的空间,有足够的空间让realloc函数进行扩容

内存扩容的机理

直接在紧接着的内存空间进行扩容

情况二:malloc 或者 calloc 开辟的空间后的一段空间的空间,不足够的空间让realloc函数进行扩容

内存扩容的机理

①在内存中找到一片足够大的空间进行开辟

②将要进行扩容空间的内容拷贝过来

③将原地址处的内存进行释放

④返回新开辟内存位置的首地址

三、常见的内存错误

①对空指针进行解引用
                产生原因:一般为没有对malloc开辟的空间进行判断

②对动态开辟的空间进行越界访问

③对于非动态开辟的空间进行free释放

④用 free 释放 malloc 开辟的空间的一部分

⑤多次使用free释放同一片空间
                解决办法:养成良好习惯,将free释放后的内存进行置空

⑥内存泄漏
                产生原因:malloc开辟的内存空间使用完忘记释放,导致这片空间在内存中存在,但是无法找到并使用,造成内存泄漏

四、几个程序题分析

五、柔性数组

;