动态内存管理

目录

与动态内存相关的几个库函数

molloc

完整形态

使用

申请空间失败

注意

free

完整形态

使用

calloc

完整形态

使用

realloc

完整形态

使用

像malloc一样开辟空间

柔性数组

什么是柔性数组

柔性数组的特点

柔性数组的使用

柔性数组的优势

注意


直接开辟空间的时候空间开辟大小是固定的
数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配
但是对于空间的需求,不仅仅是上述的情况

有时候我们需要的空间大小在程序运行的时候才能知道,
那数组的编译时开辟空间的方式就不能满足了

就需要用到更为灵活的动态内存了

与动态内存相关的几个库函数

动态内存是在堆区申请的

malloc
完整形态

使用

malloc返回的指针是void*类型的,同时我们使用动态内存时通常知道我们所需要的类型

所以一般会在使用时强转成我们需要的类型:

int* p=(int*)malloc(20);

申请20个字节的空间强制类型转换成int*类型并将地址赋给p

申请的空间里面放着随机值

因为空间是连续的,使用时与数组类似

申请空间失败

在使用malloc申请空间时,如果空间不够也可能申请空间失败,这时会返回空指针

所以在使用malloc后一般会检查一下malloc返回的值是否为空指针

注意

如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器

free
完整形态

使用

在使用完动态内存之后,我们需要手动释放

free(p)

但是释放之后p还是指向那片空间,就变成了一个野指针

为了避免这种情况,通常会在使用free释放后再将p置为NULL

如果free的参数为NULL,此时无事发生

calloc
完整形态

使用

函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0
与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0

以及参数有所不同

realloc
完整形态

使用

第一个参数为目标空间的地址,第二个参数为修改后的空间大小

使用realloc会有3种情况

1.直接修改成功

在原地址后直接开辟空间,返回原地址

2.开辟空间失败,寻找新的空间

原地址后空间不足会寻找新的空间并将原数据传到新地址处,返回新指针

3.开辟失败

返回空指针

像malloc一样开辟空间

realloc在参数上的一些变化可以做到malloc的功能:

realloc(NULL,20)

这样使用就可以申请20个字节的空间

柔性数组

什么是柔性数组

结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员:

有些编译器这样写会报错,换一种写法就可:

柔性数组的特点

1.结构中的柔性数组成员前面必须至少一个其他成员

这两种写法都是错误的,前面至少有一个其他成员

2.sizeof 返回的这种结构大小不包括柔性数组的内存

这个结构体前两个成员的大小就已经是8个字节了,说明不包括柔性数组的内存

3.包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小

其他结构体成员的大小

适应柔性数组的预期大小

柔性数组的使用

方法1:

方法2:

除了直接使用,我们还可以通过指针间接使用

柔性数组的优势

1.方便内存释放

我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉

2.这样有利于访问速度

连续的内存有益于提高访问速度,也有益于减少内存碎片。

内存碎片:多次使用malloc申请,申请的空间并不连续,而这些申请的空间之间会有未被利用的空间,就是内存碎片,内存碎片的存在会降低内存利用率,并可能影响计算机的性能。

注意

记住每次使用malloc申请空间后判断是否为空,使用结束后记得使用free释放!!!

最后,祝各位道友早日突破/进阶

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值