当前位置:网站首页>动态内存二
动态内存二
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联系
而二三,也就是不能返回局部变量的问题。
参考:图论教育之动态内存管理
边栏推荐
- Internship: Upload method for writing excel sheet (import)
- Node.js的基本使用(三)数据库与身份认证
- Apple told Qualcomm: I bought a new campus for $445 million and may plan to speed up self-development of baseband chips
- V8中的快慢数组(附源码、图文更易理解)
- 20年将投资美国约2000亿美元,三星电子财大气粗的样子真好看
- 教你如何定位不合理的SQL?并优化之
- 机器学习——库
- win10+cuda11.7+pytorch1.12.0安装
- Shell 用法梳理总结
- 汉字风格迁移---结合本地和全局特征学习的中文字体迁移
猜你喜欢

The problem of disorganized data output by mnn model

学习笔记 | uiautomation(如何)实现自动化

伦敦银最新均线分析系统怎么操作?

【OpenCV图像处理】 图像拼接技术

【详细教程】一文参透MongoDB聚合查询

It will invest about 200 billion US dollars in the United States in 20 years, and Samsung Electronics looks so handsome

View the version number of CUDA, pytorch, etc.

After building the pytorch environment, the pip and conda commands cannot be used

Unity 截取3D图像 与 画中画PIP的实现

corn表达式 具体详解与案例
随机推荐
代码重构:面向单元测试
Using matlab to solve the linear optimization problem based on matlab dynamic model of learning notes _11 】 【
面试必问的HashCode技术内幕
FinClip, help smart TV more imagination
Apple told Qualcomm: I bought a new campus for $445 million and may plan to speed up self-development of baseband chips
It will invest about 200 billion US dollars in the United States in 20 years, and Samsung Electronics looks so handsome
OpenCV 图像拼接
扩展卡尔曼滤波EKF
HNUCM 2022年暑假ACM搜索专项练习
rsync basic usage
建木DevOps流程的快速运用
Super perfect version of the layout have shortcut, background replacement (solve the problem of opencv Chinese path)
[Miscellaneous] How to install the specified font into the computer and then use the font in the Office software?
因为一次bug的教训,我决定手撕Nacos源码(先撕客户端源码)
学习笔记 | uiautomation(如何)实现自动化
免费的公共WiFi不要乱连,遭中间人攻击了吧?
【超详细】手把手教你搭建MongoDB集群搭建
手撕Nacos源码,今日撕服务端源码
iframe通信
RSS订阅微信公众号初探-feed43