位置: 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的常见面试题)

  • 荣耀x20怎么设置流量显示(荣耀x20怎么设置热点连接人数)

    荣耀x20怎么设置流量显示(荣耀x20怎么设置热点连接人数)

  • 抖音没粉丝可以直播吗(抖音没粉丝可以开小店吗)

    抖音没粉丝可以直播吗(抖音没粉丝可以开小店吗)

  • 微信删除对方对方还能看到我的朋友圈吗(微信删除对方对方还能给我发消息吗)

    微信删除对方对方还能看到我的朋友圈吗(微信删除对方对方还能给我发消息吗)

  • 怎么改手写输入法(怎么改手写字)

    怎么改手写输入法(怎么改手写字)

  • qq群投票如何修改自己的选择(qq群投票可以更改吗)

    qq群投票如何修改自己的选择(qq群投票可以更改吗)

  • 华为画中画怎么设置大小(华为画中画怎么开启)

    华为画中画怎么设置大小(华为画中画怎么开启)

  • airpods重置后名字会变吗(airpods重置后名字没有改变)

    airpods重置后名字会变吗(airpods重置后名字没有改变)

  • 苹果7p换电池多少毫安(苹果7p换电池多少钱手机店)

    苹果7p换电池多少毫安(苹果7p换电池多少钱手机店)

  • ipad无互联网连接是什么意思(ipad无互联网连接怎么解决)

    ipad无互联网连接是什么意思(ipad无互联网连接怎么解决)

  • 微信申请解除限制后什么时候可以用(微信申请解除限制理由怎么写)

    微信申请解除限制后什么时候可以用(微信申请解除限制理由怎么写)

  • 手机拍照闪光灯设置(华为手机拍照闪光灯)

    手机拍照闪光灯设置(华为手机拍照闪光灯)

  • 格式化在手机哪个位置(格式化在手机哪里)

    格式化在手机哪个位置(格式化在手机哪里)

  • 手机开视频很卡怎么回事(手机开视频突然很卡)

    手机开视频很卡怎么回事(手机开视频突然很卡)

  • 华为p30呼叫转移怎么设置(华为p30呼叫转移在哪里)

    华为p30呼叫转移怎么设置(华为p30呼叫转移在哪里)

  • 照片如何添加水印文字(照片如何添加水印图片)

    照片如何添加水印文字(照片如何添加水印图片)

  • iphone x面容坏了可以修吗(iphone x面容坏了能卖多少钱)

    iphone x面容坏了可以修吗(iphone x面容坏了能卖多少钱)

  • 华为手表运动版和时尚版区别(华为手表运动版有什么功能)

    华为手表运动版和时尚版区别(华为手表运动版有什么功能)

  • 百度音乐如何下载到u盘(百度音乐如何下载)

    百度音乐如何下载到u盘(百度音乐如何下载)

  • 荣耀v20有耳机孔么(荣耀v20耳机孔失灵)

    荣耀v20有耳机孔么(荣耀v20耳机孔失灵)

  • 手环测睡眠的原理 (手环测睡眠的原理和作用)

    手环测睡眠的原理 (手环测睡眠的原理和作用)

  • 属于输入设备的是(属于输入设备的有哪些)

    属于输入设备的是(属于输入设备的有哪些)

  • 网页显示不全怎么办?快速解决方法(网页显示不全怎么回事)

    网页显示不全怎么办?快速解决方法(网页显示不全怎么回事)

  • 【登录界面】vue、element-ui登录界面模板(vue登录页面点击登录进入首页)

    【登录界面】vue、element-ui登录界面模板(vue登录页面点击登录进入首页)

  • vue vben admin 使用, (个人感觉这项目封装的太深了!!!!)(vue-admin-master)

    vue vben admin 使用, (个人感觉这项目封装的太深了!!!!)(vue-admin-master)

  • Electron打包的桌面应用程序,运行中程序黑屏、白屏等渲染进程崩溃问题解决(electron 打包)

    Electron打包的桌面应用程序,运行中程序黑屏、白屏等渲染进程崩溃问题解决(electron 打包)

  • 又一个开源第一!飞桨联合百舸,Stable Diffusion推理速度遥遥领先(开源ei)

    又一个开源第一!飞桨联合百舸,Stable Diffusion推理速度遥遥领先(开源ei)

  • 消费税组成计税价格怎么理解
  • 税财通财务软件下载
  • 高新企业做亏损分析
  • 自然人个税申报错误怎么更改?
  • 存续分立的账务处理
  • 所得税申报时成本数据填错怎么办
  • 个人给公司开税票有没有影响
  • 代开运输发票会不会造成重复征税
  • 全额抵减税控盘分录
  • 员工成本是员工薪资的多少倍
  • 个体工商户多久不用自动注销
  • 预付设备款如何缴纳印花税
  • 公司委托其他公司为员工代缴社保公积金
  • 农副产品税率及范围
  • 企业所得税报表模板
  • 房屋租赁税费征收的时间是多久
  • 小微企业增值税减免账务处理
  • 冲回坏账准备分录
  • 可供出售金融资产发生减值会计处理
  • 进项构成比例是啥
  • 公司代缴的个税怎么查询
  • 增量留底税额怎么进行确定
  • 法定代表人的个人债务会执行公司财产么
  • 华硕主板进入bios设置
  • 应收票据到期收回时和未到期转让时
  • macos快捷键一览
  • 对公账户转私人账户手续费多少
  • 年度应付职工薪酬在科目余额表哪里看
  • 房屋租赁费如何结转成本
  • macos big sur值得升级吗
  • php5升级到php7
  • 确认的政府补助怎么入账
  • 无形资产研发成功后的支出
  • 红字发票开具后蓝字发票开具时限的问题
  • 增值税的法律法规最新
  • 一般纳税人企业所得税多久申报一次
  • 动态内存管理
  • iperf3命令和iperf2
  • 固定资金的概念及其特点
  • 财政拨入的科技费是什么
  • 以前年度损益调整怎么做账
  • 残疾人就业保障金申报时间
  • 关税完税价格计算增值税
  • 材料采购成本是什么科目
  • 被投资企业清算,长期股权投资处理
  • 织梦怎么添加相关
  • 代扣职工个人应承担的社保费
  • 个体户税务分几种
  • 个体工商户怎么年审
  • sqlserver2008实例配置
  • 银行手续费未开发票前计入什么科目
  • 企业特殊工种不备案可以补报备吗
  • sqlserver2008数据库定时备份
  • 中级会计考试时间
  • 工程物资属于什么项目
  • 长期待摊费用待摊费用
  • 收到费用报销单怎么做记账凭证
  • 固定资产装修费用如果符合固定资产
  • 怎样填写记账凭证
  • myeclipse连接mysql数据库代码
  • linux系统硬盘分区
  • vmware虚拟机怎么卸载不了
  • fedora s9
  • Mac怎么更改锁屏密码
  • switcher.exe - switcher是什么进程
  • 怎么修改win10登录名
  • Ghost XP SP3电脑市场专业装机版 V5.5
  • win8如何进入bios
  • unity跨脚本调用函数
  • unity3d特效教程
  • 微信小程序使用webview
  • CSS expression控制图片自动缩放效果代码[兼容 IE,Firefox]
  • Spring+MyBatis+Velocity+BootStrap实现Android混合App快速高效服务端
  • shell脚本获取本地ip
  • linux shell脚本实例
  • Android使用opencv处理图片灰度
  • 税务核查主要核算内容
  • 个体户注销还要交税吗?
  • 金坛归属南京
  • 主要领导负责人
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设