C/C++ 内存四区:代码区 全局区 栈区 堆区

C++ 学习(九)内存分区(代码区、全局区、栈区、堆区) 操作系统将一整块内存划分了几个区域,每个区域用来做不同的事情存储程序的二进制指令,即程序源码编译后的二进制代码存储已被初始化的全局变量、常量存储未被初始化的全局变量,和data段一样都属于静态分配,在编译阶段就确定了大小,不释放(栈空间)主要用于函数调用时存储临时变量的,这部分的内存是自动分配,自动释放的(堆空间)主要用于动态分配,C语言中malloc和free操作堆内存,Go语言主要靠GC自动管理这部分。操作系统进程的内存区域没有这么简单,比上面要复杂的多,比如内核区域、共享库区域。与。......... 阅读详情

程序的生成文件在内存中的存放,按照读写性质分为:只读部分 和 可读写部分。

    只读部分:程序代码  和 程序中的常量

    可读写部分:全局区 ,堆区,栈区

 

编写程序一定要清楚 不同内存区域的存放对象 及 生命周期。

可以将内存分为四个区域:代码区,全局区,栈区,堆区

1.代码区:

存放 CPU 执行的机器指令。

你所写的所有代码都会放入到代码区中,代码区的特点是共享和只读。

通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。

代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。

2.全局区:

   全局区内存(静态区、数据区、全局静态区、静态全局区) 在程序编译的时候就已经分配好,这块内存在程序的生命周期是整个运行期间都存在。它主要存放静态数据、全局数据和常量。   

   全局区中主要存放的数据有:

       全局变量、

       静态变量(static int a;)

       常量(const int a = 5 ; )

   全局区可以细分为data区和bss区

      2.1、data区

      data区里主要存放的是已经初始化的全局变量、静态变量和常量

      2.2、bss区

      bss区主要存放的是未初始化的全局变量、静态变量,这些未初始化的数据在程序执行前会自动被系统初始化为0或者NULL

      2.3、常量区

      常量区是全局区中划分的一个小区域,里面存放的是常量,如const修饰的全局变量、字符串常量等

3.栈区:

   栈是一种先进后出的内存结构,由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期为到释放该段栈空间。

 

4.堆区:

   堆是一个大容器,它的容量要远远大于栈,但没有栈那样先进后出的顺序。用于动态内存分配,存放程序员申请的变量。比如使用malloc, realloc,free,new 和 delete 函数控制的变量 。一般由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。堆区变量在所有的线程,共享库,和动态加载的模块中被共享使用

通过以下程序,打印出相应变量的地址就可以看出:

#include <iostream>
using namespace std;

//可编程区域,全局区,堆区,栈区
static int a = 0;
const string name = "shanghai";
int bi = 6;

int main()
{
	int hua = 0;
	string tu = "a";
	int* b = new int(8);
	int* g = new int(6);
	cout << "静态变量a:" << &a << endl;
	cout << "常量name:" << &name << endl;
	cout << "全局变量bi:" << &bi << endl;
	cout << "堆区变量b:" << b << endl;
	cout << "堆区变量g:" << g << endl;
	cout << "栈区变量hua:" << &hua << endl;
	cout << "栈区变量tu:" << &tu << endl;
}

程序执行结果如下:

通过执行结果,还可以看到:

    堆区 和 栈区  的 内存分配增长方向是相反的。

    堆区: 向高地址增长

    栈区: 向低地址增长

【P84 01】C++ 内存分区模型(代码区、全局区、栈区、堆区、new) 本文介绍了C++程序内存分区模型,主要包括代码区、全局区、栈区和堆区。代码区存放函数二进制代码,全局区存储全局变量、静态变量和常量。栈区由编译器自动管理,存放局部变量和函数参数,但不应返回栈区局部变量地址。堆区通过new运算符手动分配内存,需用delete释放,数组释放时需加[]。文章通过代码示例演示了各分区变量的地址分布和操作方式,强调了堆区内存需程序员自行管理的特点。最后提醒释放堆区数组时要使用delete[]的正确语法。 阅读详情

相关推荐

自动化革命:AI在需求分析、代码生成与测试中的深度应用

在2025年的科技浪潮中,人工智能(AI)已不再是实验室中的概念,而是深度渗透至软件开发的全生命周期。从需求分析的精准捕捉,到代码生成的自动化创作,再到测试环节的智能覆盖,AI正以革命性姿态重塑软件工程的核心环节。本文将结合2025年最新数据与行业实践,解析AI如何在这三大领域实现深度应用。

1512

【c++】内存四区(代码区、全局区、栈区、堆区)

【c++】内存四区(代码区、全局区、栈区、堆区)

FishC的博客 1857

发那科FOCAS 1/2文档——核心库文件

在开始开发前,明确目标 CNC 的具体型号、连接方式(HSSB/TCP/IP)、软件版本和配置(如轴数、程序号位数),并据此正确配置开发环境和编译选项。开发时需要包含相应的头文件。这是开发跨平台应用时需要特别注意的地方。这是开发应用时必须了解的核心文件。

snailiot的博客 1021

内存四区(代码区、全局区、堆区、栈区)

C++在程序执行的时候,内存划分为4个区域 ·代码区:存放函数体的二进制代码,由操作系统进行管理的。 ·全局区:存放全局变量和静态变量以及常量 ·栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。 ·堆区:由程序员分配和释放,若程序员不释放,程序结束后由操作系统回收。 一、代码区 ①代码区存放CPU执行的机器指令既程序汇编而成的二进制代码。 ②代码区是共享的,对于频繁执行的程序,内存中只需要保存一份即可。 ③代码区是只读的,只读的原...

qq_42174306的博客 1万+

JMeter 压测实战全教程

脚本结构:测试计划 → 线程组 → HTTP 请求 → 监听器运行方式:图形化调试,命令行生产压测核心指标:QPS、RT、错误率、CPU、GC。

weixin_48309090的博客 652

关于【中孚计算机终端保密检查系统】的卸载

卸载中孚计算机终端保密检查系统

码农之路,向死而生 4万+

内存的分区

内存一般分为四个区可以使用,存放不同的数据,使用方式也不同,分别是:堆、栈、全局(静态)、代码区。对于一个程序来说,编译程序需要占用的是五个部分:堆、栈、全局(静态)、文字常量、代码区。

m0_74168970的博客 2854

【React Native】源码分析之Native UI的封装和管理

转载请注明出处:http://blog.youkuaiyun.com/u013531824/article/details/54020287,谢谢。  ReactNative作为使用React开发Native应用的新框架,随着时间的增加,无论是社区还是个人对她的兴趣与日递增。此文目的是希望和大家一起欣赏一下ReactNative的部分源码。阅读源码好处多多,让攻城狮更溜的开发ReactNative应用的同时,也

Tiny的专栏 9779

C/C++语言的内存四区(栈区,堆区,全局区,代码区)(附图详解)

栈区是从高地址位向低地址位增长的,是一块连续的内存区域,最大容量是由系统预先定义好的,申请的栈空间超过这个界限时会提示溢出,用户能从栈中获取的空间较小。BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段的后面。数据段:数据段也属于静态内存分配。该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。text段和data段在编译时已经分配了空间,而BSS段并不占用可执行文件的大小,它是由链接器来获取内存的。

木牛的博客 5182

YOLOv8改进策略【Backbone/主干网络】| 2023 U-Net V2 替换骨干网络,加强细节特征的提取和融合

一、本文介绍 本文记录的是基于U-Net V2的YOLOv8目标检测改进方法研究。本文利用U-Net V2替换YOLOv8的骨干网络,UNet V2通过其独特的语义和细节融合模块(SDI),能够为骨干网络提供更丰富的特征表示。并且其中的注意力模块可以使网络聚焦于图像中与任务相关的区域,增强对关键区域特征的提取,进而提高模型精度。本文配置了原论文中pvt_v2_b0、pvt_v2_b1、pvt_v2_b2、pvt_v2_b3、pvt_v2_b4和pvt_v2_b5六种模型,以满足不同的需求。 文章目录一、本文

Limiiiing的博客 1721

【漏洞复现】爱数云盘 Usrm_GetAllUsers 未授权访问漏洞

爱数 AnyShare存在未授权漏洞,未授权的攻击者可以通过该漏洞获取用户名信息。

qq_67810151的博客 3121

C++代码区和全局区详解

C++面向对象编程进阶,四区概念之程序运行前的二区——代码区和全局区概念详解

qq_58619891的博客 1549

(2-4-01)目标检测与分割:地面提取(1)

请看下面的例子,生成了虚拟 LiDAR 点云数据,然后使用 DBSCAN 聚类方法进行 LiDAR 地面提取,并根据聚类结果可视化地面和非地面点云。首先生成虚拟 LiDAR 点云数据,然后基于设定的高程阈值进行地面提取,并通过 Open3D 可视化地面和非地面点云。地面提取是LiDAR(激光雷达)数据处理中的一个重要步骤,其目标是从点云数据中分离出地面点,即地面表面上的点。LiDAR点云数据通常包含地面点和非地面点(例如建筑物、树木等),地面提取的目标是从这些点中准确识别和提取地面点。

码农三叔 703

C/C++中的内存四区

C/C++中的内存四区 C++程序在执行时,将内存大方向划分为4个区域: 代码区:存放函数体的二进制代码,由操作系统进行管理的。 全局区:存放全局变量、静态变量以及常量。 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。 内存四区的意义:不同区域存放的数据,赋予不同的生命周期,使我们的编程更大的灵活性。 在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域 一. 代码区 存放 CPU 执行的机器指令,存放可执行文件

pangyushuang的博客 236

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【C++的内存四区】让我来看看哪个小笨蛋还不懂它

内存四区

纤手破新橙的博客 664

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C语言程序内存四区——栈区,堆区,全局区,代码区

C语言程序内存四区——栈区,堆区,全局区,代码区

AuroraSmith的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C/C++程序的内存模型---内存四区【粗分】(栈区、堆区、全局/静态存储区(包含常量区)、代码区)或内存五区【细分】(栈区、堆区、全局/静态存储区、常量区、代码区)

物理地址是由操作系统和硬件管理的,普通程序无法直接读取或操作物理地址(除非使用特殊的驱动或操作系统提供的接口)。存放函数的参数值、函数的返回值,局部变量(包含const修饰的局部常量)等。,进程可以访问这些地址,而物理地址的映射由操作系统和MMU(内存管理单元)管理。,而不是物理地址,物理地址的管理和映射是由操作系统和MMU负责的。不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程。但在C++代码中,正常的用户态程序是无法直接访问物理地址的。,因为进程退出后,操作系统会清理其占用的所有资源。

xinxin的博客 3508

什么叫做栈区,堆区,全局区,静态区,代码区,常量区,自由存储区?

看了很多内存存储区文档的介绍,比较杂,自己搜集总结一下,要不总是忘,自己总要去搜索,去记。 C的内存基本上分为4部分:静态存储区、堆区、栈区以及常量区。他们的功能不同,对他们使用方式也就不同。 在C++中内存分成5个区,分别是堆、栈、全局/静态存储区、常量存储区和代码区; 内存四区是指:栈区,堆区,全局区,代码区。 1:栈区(stack)? 栈区:就是那些由编译器在需要的时候分配,在不...

cow_dake 6120

明解c/c++程序的内存模型--内存四区

本篇前言 hello,又和大家见面了!这次我带来的学习分享是:明解程序的内存模式–内存四区。首先说明一哈,“明解”不是要内内存四区讲的特别深入,而是给大家讲明白内存四区是个什么东西,它的基础知识,让大家在平时学习中遇见它不会特别茫然。学习内存四区还对语言的学习有特别大的帮助(本人亲身经历,以前不明白“这个代码必须这样写,那个不能那样写”这样的规定,现在突然就懂了,原来和内存四区有关系啊!),相信大家看完这篇博客也会有这样的感受。 本篇目录 1.内存分区模型 2.代码区 3.全局区 4.栈区 5.堆区 6.小

weixin_54575205的博客 3785

C/C++存储区域划分(栈区,堆区,全局区,代码区)

常见的C/C++语言两大版本内存区域分区: 1.五大内存分区:堆、栈、全局/静态存储区、自由存储区和常量存储区。 2. 五大内存分区:堆、栈、全局/静态存储区、字符串常量区和代码区。 因为具体的内存分区与编译器有关,没有太大区别,我们粗略的将程序所占用的内存分为四个区域—栈区,堆区,全局区,代码区. 每个程序都有唯一的四个内存区域.我们需要熟悉和了解各个区域的特性,例如存储什么类型的数据, 有谁去申请开辟, 又有谁去管理释放等等。 一. 内存分配介绍 1.栈区(satck) 由编译器自动分配释放, 存放函数

weixin_44501390的博客 3880

C/C++的内存分配?栈和堆的区别?为什么栈快?

一个由 C/C++ 编译的程序占用的内存分为以下几个部分 : 栈区( stack ) ——由编译器自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈; 堆区( heap )——一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收 。分配方式类似于链表; 全局区(静态区)(static)——存放全局变量、静态数据。初始化的...

honeyJ 9238

C++ 程序的内存模型 内存四区,代码区,全局区,栈区,堆区

内存分区模型: C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理 (你写的代码都转化成二进制代码) 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配和释放,存放函数的参数值,局部变量等 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收 内存四区的意义: 不同区域存放的数据,赋予不同生命周期。 程序运行前: 在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域: 代码区: 存放CPU执行的机器指令 代码区是共享的,共

一季南凉的博客 1229

代码区、常量区、静态区(全局区)、堆区、栈区

1.前言   从上一学习C语言,到现在每天的刷题,学习编程虽然已经有两年了,但是感觉真正入门始于最近两个月刷算法题,不会算法何谈编程功底?虽然算法很重要,但是计算机的原理也很重要。一直对程序运行时的堆栈区略有耳闻,但是一直不太了解。怀着好奇的心情,查阅了很多资料,写下这篇博客。 2.概念   这里以C/C++为例,其他编程语言虽略有不同,但大体相同。C/C++编译的程序占用的内存分为几个部分: ...

Simon的博客 1838

了解C/C++中关于内存的 代码区、全局区、栈区、堆区

了解C/C++中关于内存的 代码区、全局区、栈区、堆区

m0_54185237的博客 2303

C++内存分区模型(代码区、全局区、栈区、堆区、new & delete)

文章目录0 内存分区模型1 程序运行前2 程序运行后3 new操作符 0 内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收 内存四区意义: 不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程 1 程序运行前 ​ 在程序编译后,生成了exe可执行程序,未执行该程

NewsomTech 1294
上一篇: 软件开发(电子书籍下载 )
下一篇: C++中优先队列的priority_queue<int,vector<int>,greater<int>>与priority<int>的用法
Monkey Ji
博客等级 码龄9年 113粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值