飞道的博客

明解c/c++程序的内存模型--内存四区

278人阅读  评论(0)

本篇前言
hello,又和大家见面了!这次我带来的学习分享是:明解c/c++程序的内存模式–内存四区。首先说明一哈,“明解”不是要内内存四区讲的特别深入,而是给大家讲明白内存四区是个什么东西,它的基础知识,让大家在平时学习中遇见它不会特别茫然。学习内存四区还对语言的学习有特别大的帮助(本人亲身经历,以前不明白“这个代码必须这样写,那个不能那样写”这样的规定,现在突然就懂了,原来和内存四区有关系啊!),相信大家看完这篇博客也会有这样的感受。

本篇目录

1.内存分区模型
2.代码区
3.全局区
4.栈区
5.堆区
6.小编总结

1. 内存分区模型

c/c++程序在执行时,将内存大致分为四个区域

  • 代码区: 存放函数体的二进制代码,由操作进行管理
  • 全局区: 存放全局变量和静态变量以及常量
  • 栈区:由编译器自动分配和释放,存放函数的参数值
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

内存四区的意义
不同区域存放的数据赋予不同的生命周期,给我们更大的灵活编程

这里和大家简单的说了一下内存分布模型,下面让我们具体看看它们分别有什么作用吧

2.代码区

存放CPU执行的机器指令

代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码就行

代码区是只读的,使其只读的原因是防止程序意外的修改它的指令

3.全局区

全局变量和静态变量存放在这里

全局区还包括常量区,字符串常量和其他常量也存放在这里

该区域的数据在程序结束后由操作系统释放

为了让大家更好的认识到在全局区里面的数据和不在全局区里面的数据分别有什么特点,我用一段代码图片给大家展示,相信大家看了后就一目了然了。

(为了方便观察,地址都用int强转了一下)可以清晰的看出有些数据的地址开头是一模一样的,那么它们就被存放在了同一块区域。有些开头是不一样的,它们被存放在了不同的区域。比如全局变量,静态变量,字符串常量,const修饰的全局常变量它们都是存放在全局区里面的,而局部变量,const修饰的局部变量,它们是存放其他区域的。
为了方便大家记忆那些数据在全局区中,给大家画了张图,做了一下整理对比

4.栈区

由编译器自动分配释放,存放函数的参数值,局部变量

注意事项:不要返回局部变量的地址,栈区开辟的地址由编译器自动释放

为什么说不要返回局部变量的地址呢?下面就让我再用一段代码图告诉大家

大家会发现,同样的代码输出两遍,为什么输出的值会不一样?好奇怪?
其实在函数结束的时候,数据a就被释放了,再用解引用操作符*去操作那块内存,那块内存已经不属于你了,所以会输出乱码。可是第一次明明输出的是10呀,其实这是VS编译器做的一个保留,怕你手误删除了某个数据,他就做了一次保留,所以第一次输出的是10。

5.堆区

由程序员分配释放,若程序员不释放,程序结束时由操作系统回收

在c语言中用malloc在堆区开辟内存,c++中用new

下面用new进行讲解
老样子,先上一张代码图

这里要额外用一张图说明一下,指针在本质上是局部变量,放在栈上,指针保存的数据是放在堆区
再回到图一,你会发现现在重复输出都能得到10。这是为什么呢,因为10这个数据存放在堆区,只要你不去把他释放或者结束程序,它一直都在。是不是很神奇,哈哈哈。

小编总结

这次的博客到这里就结束了,关于四大区的内容,讲的很浅,但是在初学阶段了解这些知识就够用了。我希望这次的分享可以帮到大家,如果大家发现博客中出现错误,欢迎在评论区中指出。我们下次再见!


转载:https://blog.csdn.net/weixin_54575205/article/details/115586417
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场