当前位置:网站首页>动态内存二
动态内存二
2022-08-04 00:12:00 【iccoke】
动态内存管理
那么我们就要引用动态内存这个概念 ——动态内存(Dynamic Memory),使用户能够指定虚拟操作系统启动的RAM容量,并将平台可用的系统内存最大化。
申请动态内存是在堆区中申请,而堆区对于用户是要自己管理的。
我们这里介绍几个涉及动态内存的函数,这些函数都是在#include<stdlib.h>工具包中
malloc(),这个函数的作用是申请一块指定大小的连续的内存空间
传递的参数是void *(size_t size)
例如int *p=(int*)malloc(sizeof(int)*n)
这就在堆区中申请了n个int大小的内存空间
前面提到,堆区的内存是要求使用者自己管理的
在使用完之后还要进行释放操作,如果不进行释放,那么下一次要使用的时候就不能再次使用这一块地方
因此后面都要跟上free(p),意思是释放掉p指向的内存空间
同时要对p=NULL;这一步是为了防止多次free导致访问到了不允许访问的地址引起指针崩溃的情况。
memset(),这个函数的作用是未初始化的内存进行初始化,传入参数为(void *,int value,size_t size)
特别要注意的是,这里传入的size是字节数
例如
int *p=(int *)malloc(sizeof(int)*10);
memset(p,0,sizeof(int)*10);
那么这就为申请到的未初始化的内存进行了初始化。那么这里有一个问题,依据传入的参数,我们将内存初始化为全为0,那么可不可以是1呢
其实是不可以的
0,1分别在内存上按00000000和01010101存储的,那么对应的1存入内存中就不是1了。
calloc(),这个函数的作用是用来申请具有初始化的连续的内存空间,传入参数是(int value,size_t size)。
int *p=(int*)calloc(0,sizeof(int)*10);
这里就申请到了具有初始化的连续的内存空间
realloc(),这个函数的作用是对内存进行扩容操作,传入参数是(void *,size_t size)
例如
int*p=(int *)malloc(sizeof(int )*10);
int *q=(int*)realloc(p,sizeof(int)*15);
这就把p从10个int 扩容成了15个int
但是进行扩容操作,这就涉及到了几个问题
第一,后续内存空间足够,可以扩容
第二,堆内存不足,扩容失败
第三,后续堆内存不足,不能分配,那么关于这个情况,堆内存就会有新的解决方案,他会自己找一块足够大的新的地方,然后再将原来的值复制过去,就完成了扩容。
我们来观察以下代码中的错误
示例1就是一个完整的malloc申请内存空间的过程
示例2有错误,是因为int *ip实际上是在栈当中操作内存,而free是对堆内存的操作,面对的对象不同,所以会有这样的问题
示例3在释放了申请的内存后再对原内存进行操作,实际上就是访问了不该访问的内存空间,会发生指针崩溃
示例4是访问了不允许访问的内存,会引发程序崩溃
示例5是用下标访问申请内存是,多访问了一个没这样也是访问到了不允许访问的内存
示例6是移动了指针的指向,会访问到不允许访问的内存
示例7如果要把在函数体内申请的堆内存拿到主程序中使用的话,我们应该要返回它,例如
这样就可以正确的访问到了
如果在函数体内定义一个局部变量,这个是不能返回的,因为在程序结束指针这个区域也就消失了,所以是不可以返回的
这里的第一个就可以和示例7联系
而二三,也就是不能返回局部变量的问题。
参考:图论教育之动态内存管理
边栏推荐
- libnet
- sqlnet.ora文件与连接认证方式的小测试
- Super perfect version of the layout have shortcut, background replacement (solve the problem of opencv Chinese path)
- 超级完美版布局有快捷键,有背景置换
- Read FastDFS in one article
- MPLS Comprehensive Experiment
- BPF 可移植性和 CO-RE(一次编译,到处运行)
- In V8 how arrays (with source code, picture and text easier to understand)
- 我的祖国
- A Preliminary Study of RSS Subscription to WeChat Official Account-feed43
猜你喜欢
随机推荐
Salesforce's China business may see new changes, rumors may be closing
孙宇晨受邀参加36氪元宇宙峰会并发表主题演讲
internship:编写excel表的上传方法(导入)
全面讲解 Handler机制原理解析 (小白必看)
2022年8月份DAMA-CDGA/CDGP数据治理认证招生简章
智能座舱的「交互设计」大战
分子个数 数论(欧拉函数 前缀和
LYVE1抗体丨Relia Tech LYVE1抗体解决方案
- the skip/skipif Pytest learning
关于mnn模型输出的数据杂乱无章问题
rsync 基础用法
简单了解下 TCP,学习握手和挥手以及各种状态到底是怎么样的
苹果对高通说:我4.45亿美元买下一个新园区,可能计划加快基带芯片自研
RSS订阅微信公众号初探-feed43
V8中的快慢数组(附源码、图文更易理解)
Unity 截取3D图像 与 画中画PIP的实现
SQL优化的一些建议,希望可以帮到和我一样被SQL折磨的你
Nanoprobes 棕榈酰纳米金相关说明书
POE交换机全方位解读(下)
面试必问的HashCode技术内幕