【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


那还等什么~

快点来关注并加入我们

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

相关文章
|
2月前
|
C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(二)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
2月前
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
2月前
|
存储 C语言 C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(一)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
17天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
44 4
|
2月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
115 21
|
2月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
2月前
|
存储 C语言 C++
【C++打怪之路Lv6】-- 内存管理
【C++打怪之路Lv6】-- 内存管理
41 0
【C++打怪之路Lv6】-- 内存管理
|
2月前
|
存储 C语言 C++
【C/C++内存管理】——我与C++的不解之缘(六)
【C/C++内存管理】——我与C++的不解之缘(六)
|
2月前
|
程序员 C语言 C++
C++入门5——C/C++动态内存管理(new与delete)
C++入门5——C/C++动态内存管理(new与delete)
71 1
|
2月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
202 1
下一篇
无影云桌面