内存四区(代码区 静态区 栈区 堆区)

2023-10-30

参考:内存四区(代码区 静态区 栈区 堆区)
作者:今天天气眞好
发布时间: 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.程序运行前:在程序编译后,生成了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;

结尾附上一道面试题:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存四区(代码区 静态区 栈区 堆区) 的相关文章

随机推荐

  • 小程序引入vant-weapp

    小程序引入第3方样式库
  • 灰度直方图OpenCV

    recognition cpp 此文件包含 main 函数 程序执行将在此处开始并结束 include pch h include
  • Java实现判断是否为最新版本方法

    判断是否为最新版本方法 将版本号根据 切分为int数组 比较 param localVersion 本地版本号 param onlineVersion 线上版本号 return 是否为新版本 throws IllegalArgumentEx
  • NumPy模块:Python科学计算神器之一

    欢迎来到我的博客 作者 秋无之地 简介 CSDN爬虫 后端 大数据领域创作者 目前从事python爬虫 后端和大数据等相关工作 主要擅长领域有 爬虫 后端 大数据开发 数据分析等 欢迎小伙伴们点赞 收藏 留言 关注 关注必回关 上一篇文章已
  • nginx反向代理(前端 开发环境、测试环境、生产环境 解决方案)

    什么是Nginx Nginx engine x 是一个高性能的HTTP和反向代理服务 也是一个IMAP POP3 SMTP服务 Nginx是由伊戈尔 赛索耶夫为俄罗斯访问量第二的Rambler ru站点 俄文 开发的 第一个公开版本0 1
  • 团队耗时半年,整理两份非常夯实算法工程师基本功。

    这几年来 圈子内越来越卷的话题持续不下 再加上大厂程序员 被毕业 再就业 的新闻层出不穷 贩卖给人们的焦虑也越来越多 2016年 深度学习的春天是不是要来了 2017年 人工智能是不是一个泡沫 2018年 算法岗是否值得进入 2019年 如
  • pandas使用datetime作为索引并用groupby调用tseries.offsets时间位移分组

    import numpy as np import pandas as pd from datetime import datetime from pandas tseries offsets import Day MonthEnd sj
  • 路由控制配置network命令解析

    network命令 1 命令功能 network命令用来配置BGP将IP路由表中的路由以静态方式加入到BGP路由表中并发布给对等体 undo network命令用来删除指定的以静态方式加入到BGP路由表中的路由 缺省情况下 BGP不将IP路
  • C# 获取系统Icon、获取文件相关的Icon

    1 获取系统Icon 工具下载SystemIcon exe using System using System Collections Generic using System ComponentModel using System Dat
  • 什么是DDoS攻击?

    DDoS攻击是目前最常见的网络攻击方式之一 其见效快 成本低的特点 让DDoS这种攻击方式深受不法分子的喜爱 DDoS攻击经过十几年的发展 已经 进化 的越来越复杂 黑客不断升级新的攻击方式以便于绕过各种安全防御措施 一 什么是DDoS攻击
  • QT实例 - 实现http通信

    QT实现通过HTTP与服务器进行交互 原文链接 https blog csdn net hwc3737 article details 108367037 添加依赖 在项目的 pro文件中添加 QT network 引入相关头文件 incl
  • 生命在于学习——指纹混淆技术学习

    一 前言 本篇文章仅为学习笔记记录 不得用于违规用途 本篇文章为安全社公众号的Poker安全所发 本文仅为学习复现 二 介绍 指纹混淆技术 顾名思义 就是迷惑指纹扫描识别技术 三 思路 作者的思路 1 伪装CMS 作者第一个想到的就是wor
  • python的包

    什么是模块 xxx py文件 社么是包 多个模块组成的文件夹 为啥要使用模块 让我下次直接使用 不需要再重写 或者方便多人开发 1 新建一个文件夹testModel 在此文件夹中创建一个名为 init py的文件 此时python解释器就认
  • 第一章:基本概念

    什么是数据结构 其实官方没有统一定义 数据结构是数据对象 以及存在于该对象的实例和组成实例的数据元素之间的各种联系 这种联系可以通过定义相关的函数给出 Sartaj Sahni 数据结构 算法与应用 数据结构是ADT 抽象数据类型 Abst
  • 在服务器上搭建git仓库

    在本地项目中导出裸仓库 git clone bare project name git 上传到服务器上pscp r project name git user name ip or hostname git path 在本地仓库中设置服务端
  • 蓝桥杯 算法训练 印章

    蓝桥杯 算法训练 印章 共有n种图案的印章 每种图案的出现概率相同 小A买了m张印章 求小A集齐n种印章的概率 输入输出 一行两个正整数n和m 一个实数P表示答案 保留4位小数 样例 2 3 0 7500 这是个dp问题 存在两个变量 印章
  • springboot基础篇—SpringBoot 配置

    1 配置文件 SpringBoot 使用一个全局配置文件 application yml application properties 配置文件放在 src main resources 目录或者 类路径 config 下 yml 是 YA
  • 【Spring Boot丨(11 )】json的集成

    集成JSON 概述 Jackson Gson JSON B 主页传送门 传送 概述 Spring boot 提供了三种json库的集成 Gson Jackson JSON B 上述三种库提供了将Java对象转换为JSON字符串以及将JSON
  • c语言全局变量fork,使用fork进行C语言编程()

    好吧我做错了什么 我在Ubuntu上这样做 我想让系统命令 ls 和一个参数如 a 然后让孩子执行它 然后父母只是打印出来 我不明白为什么我一直让 父母 返回两次 有任何想法吗 使用fork进行C语言编程 include include i
  • 内存四区(代码区 静态区 栈区 堆区)

    参考 内存四区 代码区 静态区 栈区 堆区 作者 今天天气眞好 发布时间 2021 04 01 18 09 13 网址 https blog csdn net qq 51118175 article details 115379779 sp