内存四区(代码区 静态区 栈区 堆区)
参考:内存四区(代码区 静态区 栈区 堆区)
作者:今天天气眞好
发布时间: 2021-04-01 18:09:13
网址:https://blog.csdn.net/qq_51118175/article/details/115379779?spm=1001.2014.3001.5501
内存相关博文:
1、内存四区(代码区 静态区 栈区 堆区)
2、程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系
3、深入理解STM32内存管理
目录
- 1.代码区
- 2.全局区
- 3.栈区
- 4.堆区
面试基本必问题目:内存分区
内存分区模型
(1)代码区
:存放函数的二进制代码,由操作系统进行管理
(2)全局区
:存放全局变量和静态变量以及常量
(3)栈区
:由编译器自动分配释放,存放函数的参数,局部变量等
(4)堆区
:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
内存四区意义:不同区域存放的数据,赋予不同的生命周期,给我们提供很大的灵活编程
下面可以分为两大类
1.程序运行前:在程序编译后,生成了exe可执行程序,未执行该程序前可分为两个区域
(1)代码区
(2)全局区
2.程序运行后:
(1)栈区
(2)堆区
下面进行详细介绍
1.代码区
1.代码区存放CPU执行的机器指令。比如我们写的程序会转为0 1这种数据后再保存在代码区
2.代码区是共享的,共享的目的是对于频繁执行的程序,只需要在内存中有一份代码即可。
3.代码区是只读的,使其只读的原因是防止程序意外的修改了他的指令
2.全局区
1.全局变量
和静态变量
存放在此
2.全局区还包含了常量区,字符串常量
和其他常量(const修饰的变量
,也叫全局常量)存放在此
3.该区域的数据在程序结束后由操作系统释放
示例代码:
#include <iostream>
using namespace std;//全局变量
int g_a = 10;
int g_b = 10; //const修饰的全局变量
const int c_g_a = 10;
const int c_g_b = 10;int main()
{//局部变量 int a = 10;int b = 10;cout << "局部变量a的地址为: " << &a << endl;cout << "局部变量b的地址为: " << &b << endl;//字符串常量cout << "字符串常量的地址为:" << &("hello world") << endl;//全局变量 cout << "全局变量g_a的地址为: " << &g_a << endl;cout << "全局变量g_b的地址为: " << &g_b << endl;//静态变量 在普通的变量前面加static,属于静态变量static int s_a = 10;static int s_b = 10;cout << "静态变量s_a的地址为: " << &s_a << endl;cout << "静态变量s_b的地址为: " << &s_b << endl;//const修饰的变量//1.const修饰的全局变量 cout << "const修饰全局变量c_g_a的地址为: " << &c_g_a << endl;cout << "const修饰全局变量c_g_b的地址为: " << &c_g_b << endl; //2.const修饰的局部变量 const int c_l_a = 10;const int c_l_b = 10;cout << "const修饰局部变量c_l_a的地址为: " << &c_l_a << endl;cout << "const修饰局部变量c_l_b的地址为: " << &c_l_b << endl;return 0;
}
运行结果:
同样也验证了全局区存放全局变量,静态变量,字符串常量和const修饰的局部变量
3.栈区
由编译器自动分配释放,存放函数的参数值
,局部变量
等
注意:不能返回局部变量的地址,栈区开辟的数据由编译器自动释放
示例代码:
#include <iostream>
using namespace std;int *fun()
{int a = 10;return &a;
}int main()
{int *p = fun();cout << *p << endl;cout << *p << endl;cout << *p << endl;return 0;
}
运行结果:
注意到:第一次可以打印正确的数字是因为编译器给我们做了一次保留,怕是误操作。但是第二次数据就不会保存,自动释放了。
4.堆区
由程序员分配释放,若程序员不释放,程序结束后由操作系统回收
在C语言中使用malloc来进行分配
在c++中使用关键字new来开辟空间
示例代码:
#include <iostream>
using namespace std;int *fun()
{int *p = new int(10) ;return p;
}int main()
{int *a = fun();cout << *a << endl;cout << *a << endl;cout << *a << endl;return 0;}
运行结果:
注意该程序只是测试程序,还要进行释放,使用关键字delete
语句:delete p;
结尾附上一道面试题:
内存四区(代码区 静态区 栈区 堆区)相关推荐
- C++中栈区 堆区 常量区
原文出自:http://baike.baidu.com/view/536145.htm C++中栈区 堆区 常量区(由一道面试题目而学习) 2009-04-28 21:01 #include<i ...
- java的栈区 堆区存放什么_简单整理java中的栈内存, 堆内存是什么?
上一篇文章简单整理了栈(stack), 堆(heap), 队列(queue)的结构 这一篇继续整理java中的 占内存,堆内存. Java把内存划分成两种:一种是栈内存,一种是堆内存. 这里需要解释一 ...
- alin的学习之路:C语言篇(一)(内存四区模型,宏函数,调用惯例,内存存储方式)
@TOC(内存四区模型,宏函数,调用惯例,内存存储方式) 1. 内存四区及其使用注意 内存四区:代码区,全局静态区,栈区,堆区 代码区 代码区存放的是CPU执行的二进制指令 特点: 只读 共享 栈区 ...
- stack vs heap:栈区分配内存快还是堆区分配内存快 ?
作者 | 码农的荒岛求生 来源 | 码农的荒岛求生 有伙伴问到底是从栈上分配内存快还是从堆上分配内存快,这是个比较基础的问题,今天就来聊一聊. 栈区的内存申请与释放 毫无疑问,显然从栈上分配内存更快, ...
- C/C++学习日记:C语言栈区与堆区浅谈
在编程中,内存分为五大分区:栈区内存,堆区,静态区,常量区,代码区. 看下面一个函数,你能发现它又什么问题?又该如何改正? char * getString() { char str[20] = &q ...
- C++在堆区创建数组
new申请数据空间 c++中的new在堆区申请空间的时候的格式是: int * p = new int(10); //该代码的意思就是说在堆区申请的内存赋值为10 //int 后面括号里面写的就是你的 ...
- 返回局部变量或临时变量的地址_值传递和地址返回两者在堆区(Heap)应用的三种易错点...
1.指针变量作为参数进行值传递给函数的形参,并在堆区(Heap)进行内存分配和赋值 程序源码: 1 结果: Segmentation fault (core dumped) 分析: 如上图,指针变量p ...
- 【Java 虚拟机原理】堆区 | Java VisualVM 工具
文章目录 一.Java VisualVM 工具 二.堆区 一.Java VisualVM 工具 Java 中提供了一个监控当前设备 Java 程序的工具 Java VisualVM ; 在命令行中执行 ...
- c/c++教程 - 2.1 程序的内存模型 内存四区 代码区 全局区 堆区 栈区 new操作符
第2章为C++核心编程. 本阶段主要针对C++面向对象编程做详细讲解. 目录 1.内存分区模型 1.1 程序运行前(代码区.全局区) 1.2 程序运行后:(栈区.堆区) 1.3 new操作符(堆区内存 ...
最新文章
- 【编程珠玑】读书笔记 第二章 算法
- 【深度学习】基于Pytorch进行深度神经网络计算(一)
- 彻底明白TCP的三次握手与四次挥手
- 2021春季每日一题【week5 未完结】
- vb.net 2019-机器学习ml.net情绪分析(3)
- 小甲鱼python课件源代码_[Python基础] 小甲鱼零基础入门Python学习视频+全套源码课件 Python视频教程 96讲...
- 【Demo 0011】多媒体播放器
- python解析response的json_python:解析requests返回的response(json格式)说明
- 网络营销时不仅需要考虑用户体验,也要赋予情感
- php循环,die/exit脚本执行控制,文件载入及错误控制
- how-to-change-the-windows-pagefile-size win10分页虚存大小
- 高等代数(第三版)北大(参考答案)
- PHP简单在线二维码生成工具源码
- 二进制,十进制,十六进制转化
- Excel图表数跨行选择数据
- 算法面试题:切割木头,给定一个数组nums,nums[i]表示每个木头的长度,木头可以截断,现在需要k根长度一样的木头,每根木头最大长度为多少
- Yii2 第三方类库安装和使用:Imagine
- 0402/0603/0805/1206封装尺寸
- 二叉树的堂兄弟节点993
- Ehcache缓存时间设置
热门文章
- Android Monkey压力测试
- C\C++与Java中的static关键字
- 探讨程序员如何学习你不熟悉的技术,以及用什么样的方法去学习.
- ROS与navigation教程——概述
- VINS状态估计篇-视觉sfm初始化
- 北京林业大学计算机技术复试,北京林业大学计算机应用技术04年考研复试办法...
- python如何自定义函数_python如何自定义函数_后端开发
- 安卓手机浏览器排行_安卓手机双11性价比排行发布|拯救者手机发透明版|小米发大光圈手机镜头...
- python 随机获取数组元素_Python创建二维数组的正确姿势
- wordpress漏洞上传php文件夹,WordPress Asset-Manager PHP文件上传漏洞