- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C静态存储区 栈 堆的区别
C静态存储区 栈 堆的区别
C静态存储区_栈_堆的区别2011-01-04 22:53C静态存储区栈堆的区别
一、内存基本构成
可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。
静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量(包括字符串常量)。
栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。由操作系统控制。
堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。
二、三者之间的区别
我们通过代码段来看看对这样的三部分内存需要怎样的操作和不同,以及应该注意怎样的地方。
例一:静态存储区与栈区
Void main
{
char*p=Hello World1;
char a=Hello World2;
p[2]=A;
a[2]=A;
char*p1=Hello World1;
}
?xml:namespace prefix=v ns=urn:schemas-microsoft-com:vml/
?xml:namespace prefix=o ns=urn:schemas-microsoft-com:office:office/
这个程序是有错误的,错误发生在p[2]=A这行代码处,为什么呢,是变量p和变量数组a都存在于栈区的(任何临时变量都是处于栈区的,包括在main()函数中定义的变量)。但是,数据Hello World1和数据Hello World2是存储于不同的区域的。
因为数据Hello World2存在于数组中,所以,此数据存储于栈区,对它修改是没有任何问题的。因为指针变量p仅仅能够存储某个存储空间的地址,数据Hello World1为字符串常量,所以存储在静态存储区。虽然通过p[2]可以访问到静态存储区中的第三个数据单元,即字符l所在的存储的单元。但是因为数据Hello World1为字符串常量,不可以改变,所以在程序运行时,会报告内存错误。并且,如果此时对p和p1输出的时候会发现p和p1里面保存的地址是完全相同的。换句话说,在数据区只保留一份相同的数据(见图1-1)。
例二:栈区与堆区
char*f1
{
Char p=hello;//栈区
return p;
}
上述代码gcc编译会报错:warning:function returns address of local variable
结果:st=p;打印出乱码
char*f2
{
char*p=NULL空指针,表示指针ipAddr暂时没有存放地址,只是开辟了一个内存,但内存没存放地址。也就没用指向,当有地址存放进去后就有了指向//在堆区p=char*new char[4];
return p;
}
这两个函数都是将某个存储空间的地址返回,二者有何区别呢?f1()函数虽然返回的是一个存储空间,但是此空间为临时空间。也就是说,此空间只有短暂的生命周期,它的生命周期在函数f1()调用结束时,也就失去了它的生命价值,即:此空间被释放掉。所以,当调用f1()函数时,如果程序中有下面的语句:
char*p;
p=f1
*p=a;
此时,编译并不会报告错误,但是在程序运行时,会发生异常错误。因为,你对不应该操作的内存(即,已经释放掉的存储空间)进行了操作。但是,相比之下,f2()函数不会有任何问题。因为,new这个命令是在堆中申请存储空间,一旦申请成功,除非你将其delete或者程序终结,这块内存将一直存在。也可以这样理解,堆内存是共享单元,能够被多个函数共同访问。如果你需要有多个数据返回却苦无办法,堆内存将是一个很好的选择。但是一定要避免下面的事情发生:
void f
{
…
char*p;
p=char*new char[100];
…
}
这个程序做了一件很无意义并且会带来很大危害的事情。因为,虽然申请了堆内存,p保存了堆内存的首地址。但是,此变量是临时变量,当函数调用结束时p变量消失。也就是说,再也没有变量存储这块堆内存的首地址,我们将永远无法再使用那块堆内存了。但是,这块堆内存却一直标识被你所使用(因为没有到程序结束,你也没有将其delete,所以这块堆内存一直被标识拥有者是当前您的程序),进而其他进程或程序无法使用。我们将这种不道德的流氓行为(我们不用,
您可能关注的文档
- 2017年高中部党风廉政建设自查报告.doc
- 2017村党支部第一书记年度工作计划.doc
- 20m、35m箱梁预应力张拉计算书.doc
- 20万温州商人给苏州的启示.doc
- 20世纪福克斯公司特刊.doc
- 20岁以上的女生。要有成人的视觉,理性的智慧。如何气.doc
- 20招教你打造通透大气家 小户型经典设计.doc
- 20种学生必备软件.doc
- 21种方式让你玩转三亚.doc
- 21世纪公司的组织结构.doc
- 《2025年流媒体平台内容合作模式分析报告:国产电影出海市场机遇》.docx
- 《2025年速冻食品行业趋势:家庭消费场景拓展与产品品类升级机遇预测》.docx
- 《2025年金融软件:金融风控系统跨境业务》.docx
- 2025年城市轨道交通智慧运维平台建设投资报告.docx
- 2025年智能垃圾分类设备技术革新与产能布局趋势分析.docx
- 2025年钢铁行业绿色生产模式创新与产能优化策略研究报告.docx
- 《智能家居场景家纺行业分析:2025年健康家纺产品创新融合机遇挖掘》.docx
- 2025年口服美容产品行业竞争格局与消费需求深度分析报告.docx
- 安全考试实操题库及答案.docx
- 2025年稀土行业产业政策调整与市场影响产业链分析报告.docx
最近下载
- 江西财经大学-微积分1-试卷含答案.pdf VIP
- 售后技术年终工作总结技术工作总结PPT.pptx VIP
- 《视听语言》课程简介及教学大纲.doc
- 智慧树《中华国学》完整排版答案.doc VIP
- 餐饮企业月度财务报表编制模板.docx VIP
- 煤炭物流仓储建设项目运营管理方案(模板范文).docx VIP
- 铜选厂尾矿资源综合回收利用建设项目可行性研究报告.doc VIP
- __主题__:地铁站务员岗位面试常见问题及参考回答,包括求职动机、日常工作内容、核心素质、过往经验、倒班制度、实际情况与预期不符等方面,以及服务意识与沟通能力、安全管理与应急处置等各类具体场景下的应对措施和考察点.docx VIP
- 2025年智慧树知到《国际关系分析》章节测试答案.pdf VIP
- 期货高手策略分析报告.pptx VIP
原创力文档


文档评论(0)