位置: IT常识 - 正文

动态内存的开辟(动态内存管理)

编辑:rootadmin
动态内存的开辟

推荐整理分享动态内存的开辟(动态内存管理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:动态内存的开辟方法,动态内存申请的三个函数的原型及特点,动态内存的使用,动态内存的作用,动态内存扩展技术,动态内存的使用,动态内存的使用,动态内存的作用,内容如对您有帮助,希望把文章链接给更多的朋友!

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰动态内存管理 

🐰malloc 

🐰calloc

🐰realloc 

🐰free 

🐰动态开辟常见的错误


🐰动态内存管理 

其实我们创建数组的时候,系统为我们就是开辟了一段连续的空间(这个空间一般是在栈区开辟的),现在我们可以自己开辟一段空间。与动态开辟相关的函数:malloc free calloc realloc

注意:数组离开作用域时,系统会自动释放这段空间,如果我们自己动态开辟的空间,离开作用域时,系统是不会帮我们释放这段空间的,如果要求释放这段动态开辟的空间,我们就需要使用free函数去释放。

🐰malloc 

malloc用于动态开辟内存,引用的头文件是#include<stdlib.h>

malloc的原型:

void* malloc (size_t size);

size_t size:开辟的字节数

注意:返回的类型是void*类型,如果想要使用这段空间,就必须强制性转化为自己想使用的类型,例如:int* p=(int*)malloc(20);这就是开辟了20个字节,然后把20个字节空间的首地址赋值给了p。

malloc的使用:

malloc开辟成功会返回开辟好的空间的首地址, malloc如果申请内存失败会返回空指针NULL,所以我们开辟好空间的话,需要去判断一下

#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>int main(){ int *p=(int *)malloc(20);//开辟了20个字节的空间 if(p==NULL) { printf("%s\n",strerror(errno));//打印开辟失败的原因 } free(p); p=NULL; return 0;}

 malloc开辟空间,不初始化,里面存放的随机值

#include<stdio.h>#include<stdlib.h>int main(){ int *p=(int *)malloc(20);//开辟了20个字节的空间 for(int i=0;i<5;i++) { printf("%d ",*(p+i)); } //使用 for(int i=0;i<5;i++) { *(p+i)=i+1; } for(int i=0;i<5;i++) { printf("%d ",*(p+i)); } free(p); p=NULL; return 0;}🐰calloc

calloc用于动态开辟内存,区别于malloc的是,calloc会初始化开辟的空间,将开辟的空间全部初始化为0,引用的头文件是#include<stdlib.h>

calloc的原型:

void* calloc (size_t num, size_t size);

size_t num:开辟的个数

size_t size:开辟的类型的大小

注意:返回的类型是void*类型,如果想要使用这段空间,就必须强制性转化为自己想使用的类型,例如:int* p=(int*)calloc(20,sizeof(int));这就是开辟了20个整形的空间,然后把20个整形空间的首地址赋值给了p。

calloc的使用:

 calloc开辟空间,初始化,里面存放的0

#include<stdio.h>#include<stdlib.h>int main(){ int *p=(int *)calloc(20,sizeof(int));//开辟了20个int类型的空间 for(int i=0;i<20;i++) { printf("%d ",*(p+i)); } free(p); p=NULL; return 0;}🐰realloc 

realloc用于原空间不足继续开辟更大的空间,引用头文件为#include<stdlib.h>

realloc的原型:

void* realloc (void* ptr, size_t size);动态内存的开辟(动态内存管理)

void* ptr:原空间的首地址

size_t size:开辟新空间的大小

注意:realloc开辟空间会遇到两种情况

1.如果原空间后面空间充足

在原空间后面继续开辟空间(返回的地址与原来的地址相同)

2.如果原空间后面空间不足

(1)realloc会找更大的空间

(2)将原来的数据拷贝到新空间

(3)释放原来的旧的空间

(4)返回新空间的地址(返回的地址与原来的地址不同)

realloc的使用:

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>int main(){ int *p=(int *)malloc(20);//开辟了20个int类型的空间 if(p==NULL) { printf("%s\n",strerror(errno)); } for(int i=0;i<5;i++) { printf("%d ",*(p+i)); } int* pc=(int*)realloc(p,sizeof(p)*2);//在原空间进行扩展 if(pc!=NULL) { p=pc;//把空间首地址还是赋给p for(int i=0;i<10;i++) { printf("%d ",*(p+i)); } } else { printf("realloc:%s\n",strerror(errno));//如果开辟失败,打印原因 } free(p); p=NULL; return 0;}🐰free 

free用于释放动态开辟的空间,引用头文件#include<stdlib.h>

free的原型:

void free (void* ptr);

void* ptr:动态开辟空间的首地址

注意:释放的空间一定是动态开辟的(就是在堆上开辟的),不然free是不起作用的。

 free的使用:

#include<stdio.h>#include<stdlib.h>int main(){ int* p=(int *)malloc(20);//开辟了20个字节的空间 free(p);//将20个字节的空间还给了系统 p=NULL;//如果不把p置为空指针,那么p就是野指针 return 0;}🐰动态开辟常见的错误

可能开辟空间失败,然后再去解引用会发生错误,所以malloc的返回值要去判断和越界访问。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>int main(){ int* p=(int*)malloc(20); //可能开辟空间失败,然后再去解引用会发生错误,所以malloc的返回值要去判断 //所以我们需要判断 if(p==NULL) { printf("%s",strerror(errno));//打印发生的错误 return; } for(int i=0;i<5;i++) { p[i]=i; } //越界访问 for(int i=0;i<10;i++)//只开辟了5个int类型的空间,却访问了10个int类型的空间 { p[i]=i; } free(p); p=NULL; return 0;}

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

#include<stdio.h>#include<stdlib.h>int main(){ int arr[10]={1,2,3}; int *p=arr; free(p);//对非动态开辟的空间进行释放 return 0;}

释放一部分动态开辟的空间

#include<stdio.h>#include<stdlib.h>int main(){ int* p=(int*)malloc(40); for(int i=0;i<10;i++) { p[i]=i; } p++;//p指向的就不是动态开辟空间的首地址 free(p);//使用free释放一块动态开辟内存的一部分,不是从开辟空间的首地址开始释放的 p=NULL; return 0;}

对一块空间多次释放

#include<stdio.h>#include<stdlib.h>int main(){ int* p=(int*)malloc(40); free(p); //p=NULL;//如果释放了指针之后,再次释放是不会出错的,因为指针为空时,free不会做出任何反应 free(p);//重复释放 p=NULL; return 0;}

不能对空指针进行解引用操作

#include<stdio.h>#include<string.h>#include<stdlib.h>void GetMemory(char* str){ str=(char *)malloc(20); //str是p的临时拷贝,malloc动态开辟的空间,将首地址给了str,p仍然是空指针}int main(){ char* p=NULL; GetMemory(p); strcpy(p,"hello world");//这里对空指针进行了解引用操作 printf("%s",p); return 0;}

野指针问题

#include<stdio.h>#include<string.h>#include<stdlib.h>char* GetMemory(void){ char str[]="hello world"; //返回栈区空间的问题 //GetMemory函数内部创建的数组str,str是临时创建,虽然返回了str数组的首地址,但是离开GetMemory函数之后,str内存会归还给系统,p的值虽然还是str数组的首地址,但是str空间已经归还给系统,str再去访问就是非法访问了。(栈区开辟的空间,离开作用域,栈区开辟的空间会被销毁) return str;}int main(){ char* p=NULL; p=GetMemory(); printf("%s",p); return 0;}

注:一定要记住

栈区:局部变量,函数形参

堆区:动态管理的空间(malloc,realloc,calloc,free)

静态区:静态变量,全局变量

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 

本文链接地址:https://www.jiuchutong.com/zhishi/299517.html 转载请保留说明!

上一篇:SpringBoot+Vue实现在线商城系统

下一篇:「Vue面试题」在项目中你是如何解决跨域的?(vue的常见面试题)

  • 要对企业网站的访问者群体进行规划。人群划分的目的是为了更好地细化内容和划分内容层次

    要对企业网站的访问者群体进行规划。人群划分的目的是为了更好地细化内容和划分内容层次

  • 苹果微信分身怎么弄(苹果微信分身怎么整)

    苹果微信分身怎么弄(苹果微信分身怎么整)

  • 淘宝一般默认几天自动收货(淘宝一般默认几天自动付款)

    淘宝一般默认几天自动收货(淘宝一般默认几天自动付款)

  • soul声音怎么关(soul声音怎么关掉)

    soul声音怎么关(soul声音怎么关掉)

  • 企业微信如何解散自己建的群聊(企业微信如何解绑邮箱)

    企业微信如何解散自己建的群聊(企业微信如何解绑邮箱)

  • 小米10如何设置电话铃声(小米10如何设置屏幕时间)

    小米10如何设置电话铃声(小米10如何设置屏幕时间)

  • 华为nova6的UFS是多少(华为nova65g是ufs3.0吗)

    华为nova6的UFS是多少(华为nova65g是ufs3.0吗)

  • 三星s10电池容量是多少(三星s10电池容量查询)

    三星s10电池容量是多少(三星s10电池容量查询)

  • 华为nova7se指纹解锁在哪(华为nova7se指纹解锁在哪里)

    华为nova7se指纹解锁在哪(华为nova7se指纹解锁在哪里)

  • 微信聊天记录不小心删了,可以恢复吗(微信聊天记录不见了)

    微信聊天记录不小心删了,可以恢复吗(微信聊天记录不见了)

  • 笔记本改水冷意义大吗(笔记本改水冷效果明显吗)

    笔记本改水冷意义大吗(笔记本改水冷效果明显吗)

  • 全屏照片怎么拍(苹果手机拍全屏照片怎么拍)

    全屏照片怎么拍(苹果手机拍全屏照片怎么拍)

  • 淘宝商品被监管一般几天被放出来(淘宝商品被监管删除再恢复会怎么样)

    淘宝商品被监管一般几天被放出来(淘宝商品被监管删除再恢复会怎么样)

  • ipadmd531ch/a是第几代(ipadmd531ch/a是mini几)

    ipadmd531ch/a是第几代(ipadmd531ch/a是mini几)

  • airpods2代真假辨别(airpods2代细节真假)

    airpods2代真假辨别(airpods2代细节真假)

  • 滴滴企业版和个人版区别(滴滴企业版和个人版)

    滴滴企业版和个人版区别(滴滴企业版和个人版)

  • 手机显示fast boot什么意思(手机显示耳机模式没声音怎么办)

    手机显示fast boot什么意思(手机显示耳机模式没声音怎么办)

  • 魅族16th和plus区别(魅族16th和plus买哪个)

    魅族16th和plus区别(魅族16th和plus买哪个)

  • 单反相机如何测光(单反相机如何测光视频介绍5d4屈光度如何调节)

    单反相机如何测光(单反相机如何测光视频介绍5d4屈光度如何调节)

  • 荣耀20怎么清理后台(荣耀20怎么清理喇叭灰尘)

    荣耀20怎么清理后台(荣耀20怎么清理喇叭灰尘)

  • qq怎么设置5g在线(qq怎么设置5g在线状态)

    qq怎么设置5g在线(qq怎么设置5g在线状态)

  • 1 7pro支持5g吗(1+7pro能用65w快充吗)

    1 7pro支持5g吗(1+7pro能用65w快充吗)

  • iwatch4充电多久(apple watchs4充电多久)

    iwatch4充电多久(apple watchs4充电多久)

  • 百度知道和百度贴吧有啥区别(百度知道和百度贴吧有什么区别)

    百度知道和百度贴吧有啥区别(百度知道和百度贴吧有什么区别)

  • win7电脑黑屏只有鼠标(win7电脑黑屏只能看见鼠标)

    win7电脑黑屏只有鼠标(win7电脑黑屏只能看见鼠标)

  • 2022年最新phpcms视频教程推荐(二次开发必学)(2022年最新公务员职务职级对照表)

    2022年最新phpcms视频教程推荐(二次开发必学)(2022年最新公务员职务职级对照表)

  • 递延所得税税率变化
  • 其他权益工具投资属于什么科目
  • 外贸企业的出口收入免征其地方水利建设基金
  • 组成计税价格的公式
  • 一般纳税人季报是哪几个月报税
  • 在建工程是负数时应该怎么处理
  • 怎样填写增值税普通发票
  • 工资可以先计提不发吗
  • 承兑汇票票号
  • 资产负债表专项储备放哪个科目?
  • 企业向个人借款需要交印花税吗
  • 前期差错会计处理知乎
  • 存货盘盈涉税问题
  • 广告公司对外捐赠的会计处理怎么做?
  • 本月进项税额不够抵扣怎么办
  • 筹建期发生的费用
  • 企业所得税以前年度亏损怎么弥补
  • 电子承兑汇票是到期日前10天提示承兑吗
  • 增值税专用发票几个点
  • 年末要计提所得税分录
  • 外购的货物用于集体福利进项税额可以抵扣吗
  • 建筑业增值税专票抵扣后的税点是多少
  • 201金8税盘抵扣期限是多久?
  • 合理工资薪金的确认原则
  • 个人借支备用金限额
  • 代扣大额医保进哪个账户
  • 外经证作废流程
  • 移动电子发票显示无法开具怎么获取发票
  • 收到往来款的账务处理
  • 类似股票期货的产品
  • 长时间不操作电动座椅会发生什么
  • linux网络设置在哪里
  • mt-mon.exe
  • 核定征收的企业怎么交所得税
  • PHP:imagefilledarc()的用法_GD库图像处理函数
  • 利润分配弥补亏损会计分录
  • sovies
  • 租房开的发票收的税怎么做账?
  • 安装elementUI
  • 三维重建是啥意思
  • OpenCV之 BGR、GRAY、HSV色彩空间&色彩通道专题 【Open_CV系列(三)】
  • yolov5增加检测层
  • java开源二次开发平台
  • 个体工商户经济类型是内资吗
  • 厂区租赁 法律规定
  • 生产车间的辅助记录
  • 挂预收账款怎么处理
  • 异地工程增值税按几个点预缴
  • 房地产城建税计税依据
  • 资产负债表的种类
  • 政府奖励收入会计分录
  • 航空电子客票行程单是发票吗
  • 固定资产清理是资产类的备抵科目吗
  • 代垫费用开什么发票
  • 商品流通企业进货费用先进行归集
  • 业务招待费税务扣除标准
  • 未完施工是存货吗
  • 农业银行多级账簿可以代发工资吗
  • 久期缺口计算公式解析
  • 房地产会计相关内容
  • 商业企业会计制度变迁论文
  • win8.1怎么安装软件
  • win7输入法图标不见了怎么恢复正常
  • linux cwd
  • cgi linux
  • WFXSVC.EXE - WFXSVC是什么进程
  • win7系统强制关机
  • linux 内核编译
  • 缩放打印到一张a4纸上设置
  • css中选择符
  • 使用一串代码
  • 适用于分析原因的工具有哪些
  • js中返回上一页
  • jquery访问本地html
  • 怎么去税务局领税盘
  • 什么是增值税免抵税额
  • 上海税务局怎么变更财务负责人
  • 出口退税需要哪些单据
  • 税务筹划和纳税申报哪个更容易学
  • 金水区地税局办事大厅
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设