动态内存管理

1.为什么会有动态内存管理

目前我们所掌握的开辟空间的方式有两种,一种就是创建一个变量,另一个就是创建一个数组来存储数据。

复制代码
int a=10;
int arr[15];

就目前我们所掌握的方式来说,创建出来的空间都是静态的,且空间长度固定后就不能在调整了。但有时候我们所需的空间内存在编译时是不知道的,这时就需要用到动态的内存开辟了。

2.malloc和free

这两个函数都要放在

复制代码
#include<stdlib.h>

的头文件中。

2.1malloc

这是一个可以进行动态内存开辟的函数

复制代码
void*malloc(size_t size);

你可以发现其返回的是指向这块空间的指针。且其最后代表是字节。

1.如果开辟成功了,则返回一个指向该空间的指针。但如果没有成功的话,一定要记得返回一个NULL的空指针,使用要判断。

2.返回的类型要自己根据实际使用来定的。

这就是malloc创建空间的方式,它是不会初识化内存的。如果没有创建成功的话一定要记得返回NULL。最后应该释放空间的。

2.2free

free的作用其实就是释放动态的内存空间的。

复制代码
void free(void*ptr)

ptr中要放的是动态开辟空间的首地址。

这里释放后之前初始化的东西就都没有了。一定记得最后将p置为空,原来p是指向一块空间的,但你释放之后,p就是野指针了,这时就要将其置为NULL即可。

3.calloc和realloc

3.1calloc

calloc其实同样可以开辟动态内存空间。

复制代码
void*calloc(size_t num,size_t size)

num是个数,size还是字节了。它和malloc不同之处就在于它在开辟空间时会将开辟的空间全部都初始化为0。

这里你也就能看出来了。或是你也可以去打印出来:

3.2realloc

realloc的作用就是在你发现你创建的空间不够时,可以自己去调整原空间的大小,这样更方便一些。

复制代码
void*realloc(void*ptr,size_t size)

第一个ptr要求指向的必须时原空间的起始地址。size的话是你要调整后的地址。

调整时你会遇到两种情况,一种是原空间后面的空间足够你要扩大的空间。另一种就是后面的空间不够你扩大,此时编译器就会连同你原来的空间都挪去一个新的空间中,以便存下你所需的空间。如果是第二种情况的话,你要注意它返回的就是新空间的地址,此时你就需要做一点点变化。

这样就ok了,用一个新的指针来去接收,若能接收到的话,再给p,不能的话再进行下面的内容。

4.常见动态内存存储得错误

这部分就不讲具体的例子了,就只展示错误的原因。

1.对NULL指针的错误解引用的错误

2.对动态开辟空间的越界访问

3.对非动态开辟空间进行free释放

4.开辟动态内存的起始地址指针进行了挪动,并对齐进行了free释放

5.对同一块空间进行了多次释放

6.动态开辟空间忘记释放

5.柔性数组

这个部分的内容其实已经不是在动态内存管理的范围了。不过其实还是有点关联的。

首先弄明白这个数组有几个关键的地方:

1.首先他必须是在结构体里面。

2.其次它得是结构中最后一个元素,也就是说结构体中必须得有两个成员往上。

3.并且它的长度是未知的。

4.sizeof在计算结构体的大小时是不计算柔性数组的。

或者是在括号中填入0也可以。

下面展示一下柔性数组的用法:

这篇博客到这就结束了。下一篇将讲解的是文件操作。

相关推荐
yi0112 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
禾小西5 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
H.莓飛5 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有6 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
chenbingjie_c7 小时前
C++ STL 适配器:stack & queue,从 vector/list 到 deque 深度解析
数据结构·c++
垆边人似月.10 小时前
华为OD算法题:查找众数及中位数
数据结构·算法·leetcode
CoderYanger10 小时前
一轮复习——F.动态规划模型总结(入门篇)
java·开发语言·数据结构·算法·leetcode·职场和发展·动态规划
一只旭宝11 小时前
数据结构与算法复习手册:从写过,到讲清楚
开发语言·数据结构·c++·算法
All for pursuit.12 小时前
【动态规划-1】121.买卖股票的最佳时机
数据结构·c++·算法·leetcode·动态规划
Logic10113 小时前
C语言/数据结构位运算题解:异或XOR找出优秀项目组中的“独特编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质