开发者社区> pzf3zdekdh6es> 正文

【C/C++教学】关于C/C++中各个区域内存的划分,你知道多少?

简介: 【C/C++教学】关于C/C++中各个区域内存的划分,你知道多少?
+关注继续查看

有话先说



我们都知道,

一个程序是由代码数据构成的。

其中代码是放在代码区,

而数据根据类型和功能  的不同,

又放在不同的区域。

那么关于这些区域是怎么划分的呢?

今天带你一探究竟。

微信图片_20220420144721.jpg




01

代码区

顾名思义,

代码区就是存储程序代码的区域。

例如下面的程序:

微信图片_20220420144725.jpg

像run()函数,

main()函数这些,

以及printf()这些可执行的代码

都是丢到了代码区。

值得注意的是代码区是只读的,

不可写


微信图片_20220420144728.jpg



02

栈区是由编译器在需要的时候分配,

用完会自动清除的一个区域,

通常这个区域存放的是

一些局部变量以及函数的参数等,

栈区的大小一般由编译器决定,

效率比较高,

但空间比较有限。

例如下面的程序:




微信图片_20220420144731.jpg

像其中func函数中的变量a,变量b,

main函数里面的变量val

                            等局部变量

以及调用func函数传入的参数200等,

这些都是存放在栈区的,

存入栈区的变量

会在代码块执行完之后清除。

同学们也可以思考一下:


微信图片_20220420144734.png


为什么这里不断循环,

执行int a = 0;

但编译器没有提示重定义的错误。

而这个:

微信图片_20220420144737.png

            编译器会提示变量a重定义了

这里用栈自动清除的特性就很容易解释了,

定义在大括号里面的变量a

是一个局部变量,

for每循环一次,

就执行下面大括号里面的内容一次,

等执行完了整个大括号的内容,

栈自动清除局部变量a,

由于a已经被清除,

下一次循环时再定义a自然不会有问题。

而下面连续在同一代码块

定义多个同名变量,

编译器自然给你一个CE了。


微信图片_20220420144740.jpg



03

堆区


前面说的,

栈区是放局部变量的区域,

大小有限。

那么实际开发中,

要从硬盘中加载一个几GB的大数据文件,

用到更多的内存空间时怎么办?

这时候你就可以用到堆区了!

堆区是由程序员手动申请的,

伴随整个程序运行周期都有效的,

一块内存区域。

堆区的释放编译器可不会管,

需要手动释放的。

如果没有释放掉,

那么只有程序结束时,

操作系统才会自动回收。

C语言中,

可以用malloc函数来申请堆区的内存。

例如下面的程序:



微信图片_20220420144744.jpg

malo函数结束后,

通过malloc申请的100个字节的内存

并不会被回收,

这一块内存则是从堆区中申请的。

说到这里,

有些邪恶的小伙伴可能已经想到了,

可以来个死循环,

然后不断申请内存,

最终卡死电脑。

 


微信图片_20220420144747.jpg



04

- 全局/静态存储区

这一块区域主要用来,

存储程序的静态变量以及全局变

先于main函数之前分配

是伴随整个程序的生命周期都存在的。

例如下面的例子:


微信图片_20220420144751.jpg

值得一提的是,

字符串常量也是放在静态区的。

从这一点上来说,

我们又可以称字符串常量为无名的静态变量。

微信图片_20220420144754.gif


尾声


看了上面的介绍

是不是对内存区域的划分更加清楚了呢

是不是觉得自己的肚子里的墨水又多了呢

小编觉得答案毋庸置疑了>-<

微信图片_20220420144805.jpg


那还等什么~

快点来关注并加入我们

增长自己的 姿势水平 吧~~~

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C/C++内存分区
C/C++内存分区
12 0
爱上c++的第一天:内存存储模型,引用和函数方面的知识
在运行的时候调用程序分配内存可以在任何时候决定分配内存即分配的大小,用户自行决定在何时释放。堆中的所有东西都是匿名的,不能用名字访问,只能通过指针来访问。
10 0
C/C++编程题之int型正整数在内存中存储时1的个数
C/C++编程题之int型正整数在内存中存储时1的个数
14 0
【维生素C语言】第十四章 - 浅析C/C++程序的内存开辟
本篇博客旨在加深动态内存开辟的理解,以 C/C++ 程序的内存开辟为主题进行简要的分析。
17 0
C++内存分区模型
C++内存分区模型
25 0
C++指针的内存分配与内存安全
C++指针的内存分配与内存安全
35 0
基于堆栈内存详析 Java函数形参是传值还是引用? | C++指针与Java引用的区别 | C++引用、指针等之间的区别 | C++与Java类的实例化的区别
基于堆栈内存详析 Java函数形参是传值还是引用? | C++指针与Java引用的区别 | C++引用、指针等之间的区别 | C++与Java类的实例化的区别
28 0
谷歌改善 Chrome 内存安全:通过 heap scanning 算法减少 C++ 代码库安全漏洞
谷歌改善 Chrome 内存安全:通过 heap scanning 算法减少 C++ 代码库安全漏洞
58 0
C++核心编程之内存分区模型,巧妙理解内存四区及new关键字的使用
C++核心编程之内存分区模型,巧妙理解内存四区及new关键字的使用
27 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
继承与功能组合
立即下载
对象的生命期管理
立即下载
移动与复制
立即下载