C/C++:堆栈详解总结

C/C++内存布局 读书笔记:游戏引擎架构第二版 目的:了解存储空间如何分配,多种C/C++变量类型如何运作,需要认识的C/C++的内存布局。 一 可执行映像 当生成C/C++ 程序时,链接器创建可执行文件,这种流行的可执行文件格式 称为可执行与可链接格式。一些平台的可执行文件格式.elf 作为扩展名,windows上的可执行文件格式使用.exe作为扩展名。 无论是哪种文件格式,可执行文件总是包含程序的部分映像,程序执行时这部分映像会放在内存中。之所以被称为部分映像是因为:由于程序除了把可执行映像置于内存中,一般也会分配额外的 阅读详情
存储器 header 2
栈区 系统自动分配,由程序自动创建、自动释放。函数参数、局部变量以及返回值等信息都存在其中
堆区 使用自由,不需要预先确定大小。多少情况下需要程序员手动申请、释放。如果不释放,程序结束后有操作系统垃圾回收机制收回。例如,s = (char *)malloc(10),
静态区/全局区 全局变量和静态变量的存储区域。程序结束后由系统释放
常量区 用于存放常量的内存区域
代码区 存放代码
例如:

  #include <stdio.h>
  int quanju;/*全局变量,全局区/静态区(static)*/
  void fun(int f_jubu); /*程序代码区*/
  int main(void)/**/
  {
    int m_jubu;/*栈区(stack)*/
    static int m_jingtai;/*静态变量,全局区/静态区(static)*/
    char *m_zifum,*m_zifuc = "hello";/*指针本身位于栈。指向字符串"hello",位于文字常量区*/
    void (*pfun)(int); /*栈区(stack)*/
    pfun=&fun;
    m_zifum = (char *)malloc(sizeof(char)*10);/*指针内容指向分配空间,位于堆区(heap)*/
    pfun(1);
    printf("&quanju   : %x/n",&quanju);
  
C/C++堆栈指引 EBP寄存器是用于访问堆栈中的数据的,它指向堆栈中间的某个位置(具体位置后文会具体讲解),函数的参数地址比EBP的值高,而函数的局部变量地址比EBP的值低,因此参数或局部变量总是通过EBP加减一定的偏移地址来访问的,比如,要访问函数的第一个参数为EBP+8。这个特性有什么用呢,我们知道EBP+4地址存储了函数的返回地址,通过该地址我们可以知道当前函数的上一级函数(通过在符号文件中查找距该函数返回地址最近的函数地址,该函数即当前函数的上一级函数),以此类推,我们就可以知道当前线程整个的函数调用顺序。 阅读详情

相关推荐

C/C++获取程序堆栈信息

碧玉妆成一树高 万条垂下绿丝绦 前言 如果是想做profile,可以使用libunwind获得C++的堆栈信息。 libunwind 这玩意说实话,资料特别特别少,特别是相关接口使用的例子,我只找到了一个,然后其他人全部抄的这一个,而且他还是获取当前程序堆栈的,也就是必须在被profile的程序中调用libunwind接口才能获取到堆栈信息。。。然后还不是中文的,国内关于libunwind的资...

bbkgl的博客 3808

C/C++中手动获取调用堆栈

当我们的程序core掉之后,如果能获取到core时的函数调用堆栈将非常有利于定位问题。在Windows下可以使用SEH机制;在Linux下通过gdb使用coredump文件即可。 但有时候由于某些错误导致堆栈被破坏,发生拿不到调用堆栈的情况。 一些基础预备知识本文不再详述,可以参考以下文章: 函数调用栈的获取原理分析寄存器、函数调用与栈帧 需要知道的信息: 函数调用对应的call

loop in codes 6923

c/c++的堆栈检查

windows线程栈有个特点:分配虚拟内存的时候并不给它指定物理存储器,只有在访问上一个页面的时候,才会给当前页面指定物理存储器。也就是说当你声明一个数组a[10000]时候,系统只会给a[0]~a[999]分配物理存储器,当你访问a[0]~a[999]中任意一个元素的时候,系统才会给a[1000]~a[1999]分配物理存储器,如果直接访问一个没有指定物理存储器的地址,操作系统会直接杀死你的

SMSDK的专栏 1761

C/C++语言堆栈指引

我们经常会讨论这样的问题:什么时候数据存储在飞鸽传书堆栈(Stack)中,什么时候数据存储在堆(Heap)中。我们知道,局部变量是存储在堆栈中的;debug时,查看堆栈可以知道函数的调用顺序;函数调用时传递参数,事实上是把参数压入堆栈,听起来,堆栈象一个大杂烩。那么,堆栈(Stack)到底是如何工作的呢?本文将详解C/C++堆栈的工作机制。阅读时请注意以下几点: 1)本文讨论的语言是VisualC...

希望我的博客,能帮上你解决学习中工作中所遇到的问题 623

使用链表实现堆栈(C/C++)

最后,释放原来的栈顶节点的内存空间,并返回栈顶节点的值。但需要注意的是,链表实现的堆栈在内存消耗方面可能比数组实现的堆栈更高,因为每个节点需要额外的指针空间。首先,我们需要定义一个节点结构体,用于表示链表中的节点。节点结构体包含两个成员变量:一个是用于存储数据的值,另一个是指向下一个节点的指针。在链表实现的堆栈中,入栈操作和出栈操作都是在链表的头部进行的。然后,将新节点插入到链表的头部,即将链表的头指针指向新节点,新节点的。在上述代码中,我们首先创建一个新的节点,并将要入栈的值赋给节点的。

DplaAnaconda的博客 380

CentOS8静默安装Oracle11.2.0.1

背景 新安装oracle,用静默安装方式就不需要安装图形界面了,省时省力。 前期准备工作与图形化安装一样,如创建用户|用户组、环境变量、内核参数、创建目录等. 可参考图形化安装,链接:https://blog.youkuaiyun.com/heroicpoem/article/details/104229369 环境 平台 版本 操作系统 centOS 8 Oracle 11gR2 1.响应文件 响应文件的内容就是图形化安装时手工设置的选项内容。 解压后,database/response/db

heroicpoem的专栏 4518

用STM32H7的FMC+AD7606搭建多通道数据采集系统:两种工作模式(查询与FIFO中断)的代码详解与性能对比

本文详细解析了基于STM32H7微控制器和AD7606 ADC芯片的多通道数据采集系统设计,重点对比了查询模式与FIFO中断模式的实现方法与性能差异。通过FMC总线实现高速并行数据采集,系统支持16bit同步采样,最高可达200Ksps/通道。文章提供了完整的代码实现和优化策略,帮助工程师在工业监测等实时性要求高的场景中构建可靠的数据采集方案。

weixin_30599769的博客 488

PLC编程入门基础知识

PLC即为可编程逻辑控制器,实质是一种专用于工业控制的计算机,其硬件结构基本上与微型计算机相同。

SANRENYIXING的博客 2万+

百度新闻评论内容抓取

通过抓包分析发现,百家号手机app端文章评论内容接口为:https://ext.baidu.com/api/comment/v1/comment/getlist?appid=101&sid=1008524_2-1010050_1-1007549_23033-1007550_23035&cuid=01B5EAF73E8A83BB842BE04E4FB6C656|23200201047...

codingforhaifeng的博客 2422

ANSYS APDL 异类单元连接实战:MPC方法在壳-实体装配中的应用

本文详细介绍了在ANSYS APDL中使用MPC方法实现壳单元与实体单元高效连接的技术要点。通过分析工程仿真中的常见需求,阐述了MPC方法在解决异类单元连接问题上的优势,包括网格独立性、自由度耦合和载荷传递等特性,并提供了具体的APDL命令流操作示例和实用经验技巧。

weixin_33391446的博客 178

时空智友企业流程化管控系统文件上传漏洞

时空智友企业流程化管控系统是一个功能丰富、灵活可定制的企业管理工具。通过该系统,企业能够实现流程的自动化、协同的提升、数据的洞察和决策的优化,从而提高工作效率、管理水平和企业竞争力。时空智友企业流程化管控系统 formservice接口处存在任意文件上传漏洞,未经认证的攻击者可通过此接口上传后门文件,最终可导致服务器失陷。

holyxp的博客 1033

杰理JL703N的SDK内部MIDI 音色库功能使用教程

本文介绍了MIDI琴按键解码和MIDI文件解码的实现方法。MIDI琴解码通过audio_dec_midi_ctrl.c文件实现,MIDI文件(mfa格式)解码则使用audio_dec_midi_file.c。使用前需将音色文件存放在SD卡或内置flash中(需确保四字节对齐),并在download.c中配置路径。同时需在板级配置中将FLASH设置为16Mbit以解决编译问题。关键注意事项包括音色文件的文件夹结构对齐要求和MIDI数据流的正确配置。

qq_42014563的博客 390

国科大学习资料--VLSI测试与可测试设计--2020期末考试试题

国科大学习资料–VLSI测试与可测试设计–2020期末考试试题 国科大学习资料–VLSI测试与可测试设计–2020期末考试试题 国科大学习资料–VLSI测试与可测试设计–2020期末考试试题 一、概念题 1简述可测试性测度与两个主要的测度指标的含义; 2以March C-算法为例,说明March算法的构成,以及March C-算法的故障覆盖率; 3“效果-原因”诊断法和“原因效果诊断法”的不同; 4列举四条扫描设计时出现的问 题及解决办法; 5最少写出1149.1与1500的五点不同; = = = = =

无名何许人的博客 1150

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 力扣160. 最浪漫的相交链表
下一篇: 使用C++批量下载url链接图片
ECHO-W
博客等级 码龄8年 1粉丝 25原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值