参考:内存四区(代码区 静态区 栈区 堆区)
作者:今天天气眞好
发布时间: 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;

结尾附上一道面试题:

内存四区(代码区 静态区 栈区 堆区)相关推荐

  1. C++中栈区 堆区 常量区

    原文出自:http://baike.baidu.com/view/536145.htm C++中栈区 堆区 常量区(由一道面试题目而学习) 2009-04-28 21:01 #include<i ...

  2. java的栈区 堆区存放什么_简单整理java中的栈内存, 堆内存是什么?

    上一篇文章简单整理了栈(stack), 堆(heap), 队列(queue)的结构 这一篇继续整理java中的 占内存,堆内存. Java把内存划分成两种:一种是栈内存,一种是堆内存. 这里需要解释一 ...

  3. alin的学习之路:C语言篇(一)(内存四区模型,宏函数,调用惯例,内存存储方式)

    @TOC(内存四区模型,宏函数,调用惯例,内存存储方式) 1. 内存四区及其使用注意 内存四区:代码区,全局静态区,栈区,堆区 代码区 代码区存放的是CPU执行的二进制指令 特点: 只读 共享 栈区 ...

  4. stack vs heap:栈区分配内存快还是堆区分配内存快 ?

    作者 | 码农的荒岛求生 来源 | 码农的荒岛求生 有伙伴问到底是从栈上分配内存快还是从堆上分配内存快,这是个比较基础的问题,今天就来聊一聊. 栈区的内存申请与释放 毫无疑问,显然从栈上分配内存更快, ...

  5. C/C++学习日记:C语言栈区与堆区浅谈

    在编程中,内存分为五大分区:栈区内存,堆区,静态区,常量区,代码区. 看下面一个函数,你能发现它又什么问题?又该如何改正? char * getString() { char str[20] = &q ...

  6. C++在堆区创建数组

    new申请数据空间 c++中的new在堆区申请空间的时候的格式是: int * p = new int(10); //该代码的意思就是说在堆区申请的内存赋值为10 //int 后面括号里面写的就是你的 ...

  7. 返回局部变量或临时变量的地址_值传递和地址返回两者在堆区(Heap)应用的三种易错点...

    1.指针变量作为参数进行值传递给函数的形参,并在堆区(Heap)进行内存分配和赋值 程序源码: 1 结果: Segmentation fault (core dumped) 分析: 如上图,指针变量p ...

  8. 【Java 虚拟机原理】堆区 | Java VisualVM 工具

    文章目录 一.Java VisualVM 工具 二.堆区 一.Java VisualVM 工具 Java 中提供了一个监控当前设备 Java 程序的工具 Java VisualVM ; 在命令行中执行 ...

  9. c/c++教程 - 2.1 程序的内存模型 内存四区 代码区 全局区 堆区 栈区 new操作符

    第2章为C++核心编程. 本阶段主要针对C++面向对象编程做详细讲解. 目录 1.内存分区模型 1.1 程序运行前(代码区.全局区) 1.2 程序运行后:(栈区.堆区) 1.3 new操作符(堆区内存 ...

最新文章

  1. 【编程珠玑】读书笔记 第二章 算法
  2. 【深度学习】基于Pytorch进行深度神经网络计算(一)
  3. 彻底明白TCP的三次握手与四次挥手
  4. 2021春季每日一题【week5 未完结】
  5. vb.net 2019-机器学习ml.net情绪分析(3)
  6. 小甲鱼python课件源代码_[Python基础] 小甲鱼零基础入门Python学习视频+全套源码课件 Python视频教程 96讲...
  7. 【Demo 0011】多媒体播放器
  8. python解析response的json_python:解析requests返回的response(json格式)说明
  9. 网络营销时不仅需要考虑用户体验,也要赋予情感
  10. php循环,die/exit脚本执行控制,文件载入及错误控制
  11. how-to-change-the-windows-pagefile-size win10分页虚存大小
  12. 高等代数(第三版)北大(参考答案)
  13. PHP简单在线二维码生成工具源码
  14. 二进制,十进制,十六进制转化
  15. Excel图表数跨行选择数据
  16. 算法面试题:切割木头,给定一个数组nums,nums[i]表示每个木头的长度,木头可以截断,现在需要k根长度一样的木头,每根木头最大长度为多少
  17. Yii2 第三方类库安装和使用:Imagine
  18. 0402/0603/0805/1206封装尺寸
  19. 二叉树的堂兄弟节点993
  20. Ehcache缓存时间设置

热门文章

  1. Android Monkey压力测试
  2. C\C++与Java中的static关键字
  3. 探讨程序员如何学习你不熟悉的技术,以及用什么样的方法去学习.
  4. ROS与navigation教程——概述
  5. VINS状态估计篇-视觉sfm初始化
  6. 北京林业大学计算机技术复试,北京林业大学计算机应用技术04年考研复试办法...
  7. python如何自定义函数_python如何自定义函数_后端开发
  8. 安卓手机浏览器排行_安卓手机双11性价比排行发布|拯救者手机发透明版|小米发大光圈手机镜头...
  9. python 随机获取数组元素_Python创建二维数组的正确姿势
  10. wordpress漏洞上传php文件夹,WordPress Asset-Manager PHP文件上传漏洞