C/C++内存布局

解密程序的内存基石:C/C++栈的生长方向与内存布局 本文探讨了C/C++程序中栈的内存布局及其生长方向问题。通过分析栈作为后进先出(LIFO)数据结构的特性,指出现代计算机体系结构中栈通常向低地址方向生长。文中提供了一段验证代码,通过打印连续定义的局部变量地址,观察到变量地址依次递减的现象,证实了栈从高地址向低地址生长的特性。这一结论对于理解函数调用、局部变量存储等底层机制具有重要意义,帮助开发者更深入地掌握内存管理知识。 阅读详情
  下图是c/c++的进程的内存分布布局图,搞清楚内存布局对于理解一个程序是非常重要的。

   一个程序运行起来,操作系统会给每个进程分配一个 4G 的程序地址空间,当然这都是虚拟地址空间,因为如果一个进程分 4G 的内存,那么就算有再多的内存也不够分。
   这些虚拟地址空间中的内存分段都是什么意思呢?下面进行讲解:
在这里插入图片描述
一、首先进程地址空间的 1G 内核空间是给操作系统使用的,我们用户是没有操作权限的。
二、剩下的 3G 内存空间中,分为了栈区、内存映射段、堆区、数据段、bss段、代码段
1)栈区:这里的栈和数据结构的栈并不相同,数据结构的栈是一种后进先出的数据结构,而内存划分的栈是操作系统按照栈的特性,给用户划分出的内存区间。
   栈区一般存放:函数体的局部变量、函数调用期间的所有参数压栈、函数的返回值
注意栈区这段内存是由操作系统自己维护的,所以函数结束,在栈上的空间会由操作系统自己回收。

2)堆区:用户所操作的内存就是堆上的空间,用户可以使用 malloc / calloc / realloc / new 申请堆上的空间,但是用户申请堆上的空间必须自己手动释放,不然会造成内存泄漏。

3)内存映射段:里面存放 动态库 / 静态库,以及文件映射,匿名映射等等一切有依赖性的东西都在这段区域

4)一个程序本质上都是由 bss段、数据段、代码段组成的
   数据段:存放全局变量、静态类型的变量。当代码编译完后,在可执行程序这个文件中已经把这些数据的空间划分好了,这种类型的数据,在程序运行以前,操作系统就将数据段中的数据加载到内存了。也就是说在进入 main 函数之前这些数据已经划分号空间了。

   bss段:其实在 C 语言中,数据段中还有一个 bss 段,这里面存放的是未初始化的全局变量和静态数据,而数据段中存放的是已经初始化过的全局变量和静态数据。数据段中的所有数据已经划分好空间了,但是 bss 段并没有给其中的数据划分空间。

   代码段:存放可执行代码,以及只读常量(字符串常量等等)。这段内存是只读的。

【逆向工程】C/C++的反汇编表示详解(1)函数调用,栈平衡,变量与参数的内存布局 很多人学完汇编,去看C/C++的反汇编就会很懵,发现单独看一条指令看的明明白白,但连在多条指令连在一起就不知道有什么作用了,如 push ebp mov ebp,esp sub esp,40h lea edi,[ebp-40h] mov ecx,10h mov eax,0CCCCCCCCh rep stos dword ptr [edi] 这里用VC6.0是最好的,更能看出本质,VS系列也可以,VS的话 阅读详情

相关推荐

基因家族快速鉴定指南:Windows平台下的HMMER实战解析

本文详细解析了在Windows平台下使用HMMER工具进行基因家族快速鉴定的完整实战流程。通过手把手指导,从软件获取、数据准备到模型构建与序列搜索,帮助生物信息学新手无需Linux环境,即可高效完成bZIP转录因子等家族的鉴定工作,大幅降低分析门槛。

weixin_29255731的博客 458

C/C++程序内存的分配

一、一个C/C++编译的程序占用内存分为以下几个部分: 栈区(stack):由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。 堆区(heap):一般由程序员自动分配,如果程序员没有释放,程序结束时可能有OS回收。其分配类似于链表。 全局区(静态区static):存放全局变量、静态数据、常量。程序结束后游戏厅释放。全局区分为已初...

cherrydreamsover的博客 4万+

腾讯、飞书等在线表格自动化编辑--python

在线文档自动化处理数据

qq_32828053的博客 2万+

C++进程内存分布

(1)C++进程内存分布 1、内存分布分为五部分,从高地址到低地址依次为:栈、堆、未初始化的数据段(bss)、初始化的数据段、代码段 2、栈地址空间向下、堆地址空间向上 3、代码段(text):存放程序的二进制代码 4、初始化的数据(Data):它包含有程序员初始化的全局变量和静态变量, 5、未初始化的数据段(bss):这个段的数据在程序开始之前由内核初始化为0,包含所有初始化为0和没有显示初始化的全局变量和静态变量 6、堆:堆是动态内存分配通常发生的部分,其地址分配由低到高 7、栈:存放自动变量,以及每

田一一 1277

解决Docker拉取镜像报错:Get https://registry-1.docker.io/v2/: 报错

解决Docker拉取镜像报错: Get “https://registry-1.docker.io/v2/”: net/http: request canceled while waiting for connection问题描述Get "https://registry-1.docker.io/v2/"是docker官方的镜像源,下载很慢的,一般会自己指定国内映射的加速镜像源。

qq_33650333的博客 4171

芒果YOLO11改进23:主干Backbone篇GhostNet:原创改进高效 GhostNet 网络,华为出品,打造全新检测器

主干Backbone篇GhostNet:原创改进高效 GhostNet 网络,华为出品,打造全新检测器

包括YOLOv5、YOLOv7、YOLOv8等模型改进 404

C++ 数据语义学——进程内存空间布局

当把一个可执行文件加载到内存后,就变成了一个进程。

慢慢记录,慢慢更新。 680

自然语言处理之机器翻译:Transformer:Transformer在低资源语言翻译中的应用

Transformer模型是自然语言处理领域的一个重要突破,由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN)的序列依赖性,采用自注意力机制(Self-Attention)处理输入序列,极大地提高了训练效率和模型性能。

zhubeibei168的博客 1014

C++内存分布介绍

C++内存分布和管理

yzy521wjm的博客 699

基于HTML5的酒店在线预订系统设计与实现

1.背景介绍 酒店预订系统,作为现代酒店业务中的重要一环,其便捷性、智能化程度直接影响着酒店的服务质量和经营效果。近年来,随着互联网技术和移动设备的快速发展,以及消费者行为的日益电子化,酒店预订系统也正在经历一场深刻的变革。传统的酒店预订系统往往依赖于复杂的软件安装和硬件设备,而新一代的酒店预订系统则更加强调在线、移动和云端的特性。HTML5作为一种前

AI天才研究院 1909

不会路由器叠加多条宽带?看这个就够了,能让你的局域网速度更快!

通常我们在企业网络或实际项目中,随着用户的增加,一条或者几条带宽不能满足正常使用,便可以对带宽进行叠加,便于网络带度更快;通常家里有可能有两条带宽的,联通或移动的,可能都是充话费送的,但网速都不怎么样,不用可惜,用之委屈,那怎么办呢?如在迅雷上开启下载,多个资源同时下载,此时总带宽可以达到120M,也就是WAN口带宽可以叠加。多wan口路由器, 一般是有2个wan口,分别为wan1与wan2。当然也有更多的wan口的。[1] 对整个局域网来说,出口带宽数量多了,相当于总带宽上升,这样是可以起到叠加效果。

qq_43416206的博客 1111

C++基础(四) —— 内存分配

内存管理

weixin_42690036的博客 1626

【实战项目开发技术分享】机器人安全通过狭窄区域的方案

在机器人的应用领域中,有时会遇到需要机器人通过狭窄区域的情况。无论是室内还是室外,机器人需要具备适应性和灵活性,以便在狭窄的空间中进行安全、高效的导航。本文将提供一些如何让机器人通过狭窄区域的实现方案和思路,希望帮助读者可以根据实际的开发需要进行适当调整和扩展。

xiewf的博客 2万+

C/C++程序内存布局

C/C++程序内存布局1. 运行可执行程序前的内存分区1.1 代码区text1.2 全局初始化数据区/静态数据区(data段)1.3 未初始化数据区(又叫 bss 区)2. 运行可执行程序后的内存分区2.1 代码区(text segment)2.2 未初始化数据区(BSS)2.3 全局初始化数据区/静态数据区(data segment)2.4 栈区(stack)2.5 堆区(heap)3. 变量作用域生命周期和储存位置总结 1. 运行可执行程序前的内存分区   C代码经过预处理、编译、汇编、链接4步后生成一

kuanyew的博客 815

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【转载】C/C++内存布局策略详解

详解C/C++的内存布局,以及C++对象内存布局,以及C和C++内存布局之间有什么区别。 C程序内存布局 Linux C程序内存布局 主要分为以下几部分组成: 代码段 初始化数据段(数据段) 未初始化数据段(BSS段) 堆 栈 以下分别来介绍各部分的作用。 代码段 代码段是由程序中的机器代码组成。在C语言中,程序经过编译后,形成机器代码。在执行的过程中,CPU...

勤学如春起之苗,不见其增,日有所长! 辍学如磨刀之石,不见其损,日有所亏! 210

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C/C++内存布局及对齐

1.源文件转换为可执行文件 源文件经过以下几步生成可执行文件: 1、预处理(preprocessor):对#include、#define、#ifdef/#endif、#ifndef/#endif等进行处理 2、编译(compiler):将源码编译为汇编代码 3、汇编(assembler):将汇编代码汇编为目标代码 4、链接(linker):将目标代码链接为可执行文件 ...

201

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C/C++:内存布局与程序栈

可寻址模型和内存布局 我们知道,内存是由操作系统统一管理的,内存里面一个字节就等于8个二进制位,然后操作系统就为内存空间进行编号,这就是我们所说寻址模型。那么我们经常说的32位指的是什么呢?其实操作系统给内存编号最大只编号到2的32次方(即只能编42,9496,7296个地址编号),而每个编号逻辑上喜欢使用十六进制来表示,并且用于表示内存的具体位置。形式通俗点说就是4GB的内存大小。为什么32位x86的操作系统无法使用大于4GB的内存条的额外空间?原因就在这里。 C/C++程序(进程)的内存寻址模

Taopper的博客 960

C/C++ 内存布局与程序栈

转载《C/C++ 内存布局与程序栈》@铁甲万能狗这个博主写的系列文章挺好的,转载过来,记录一下。 C/C++ 内存布局与程序栈一、可寻址模型和内存布局二、C/C++程序(进程)的内存寻址模型IA32平台的程序栈push操作 一、可寻址模型和内存布局 我们知道,内存是由操作系统统一管理的,内存里面一个字节就等于8个二进制位,然后操作系统就为内存空间进行编号,这就是我们所说寻址模型。那么我们经常说的32位指的是什么呢?其实操作系统给内存编号最大只编号到2的32次方(即只能编42,9496,7296个地址编号

好好学习,天天向上~ 321

C/C++的内存布局

C/C++的内存布局通常有两种说法:一种是堆、栈、全局/静态存储区、自由存储区和常量存储区。另外一种是堆、栈、全局/静态存储区、字符串常量区和代码区。其实更详细准确的说法如下: 1 .rodata段:存放只读数据,比如printf语句中的格式字符串和开关语句的跳转表。也就是你所说的常量区。 例如,全局作用域中的 const int ival = 10,ival存放在.rodata段

@_囚徒-2018_的家园 682

c/c++ 内存布局

首先看一场内存分布图: 1.栈 栈底处于高地址,而栈顶处于低地址。由此可知栈分配内存大致是按照由高址到低址分配。 #include #include int main() { char a[4]; char b[4]; char c[4]; printf("addr_a = %x\n",a); printf("addr_b = %x\n",b); printf("addr_

码蚁——步步前行 744

C/C++ 内存布局

为什么需要知道C/C++的内存布局和在哪可以可以找到想要的数据?知道内存布局对调试程序非常有帮助,可以知道程序执行时,到底做了什么,有助于写出干净的代码。 本文的主要内容如下: 源文件转换为可执行文件可执行程序组成及内存布局数据存储类别一个实例总结 源文件转换为可执行文件 源文件经过以下几步生成可执行文件: 1、预处理(preprocessor):对#include

lanhaics的专栏 1251

深扒 C/C++ 内存布局:从内核映射到编译器优化

聊起 C/C++ 内存布局,多数人只记得 “栈快堆灵活”“静态区常驻”—— 但这连皮毛都算不上!真到调试内存泄漏、优化缓存命中率、定位段错误时,不懂内核如何映射内存、编译器如何安排对象、CPU 如何访问栈帧,照样抓瞎。今天咱们把内存布局 “拆到原子级”:从 Linux/Windows 的内核内存划分,到 ELF/PE 文件的加载细节,再到 ptmalloc2 的 chunk 管理、x86-64 的栈帧防护,甚至 C++ 虚函数表的内存位置 —— 全给你讲透,让你能定位 90% 的底层问题!

2501_93283929的博客 410
上一篇: 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
下一篇: C/C++动态内存管理
coolnut12138
博客等级 码龄9年 51粉丝 75原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值