堆栈

堆栈之间的差别

匿名 (未验证) 提交于 2019-12-03 00:18:01
栈和堆栈是一个概念。 队列先进先出,在队头做删除操作,在队尾做插入操作。 栈先进后出,在栈顶做插入和删除操作。 堆和它们不同,不存在是先进后出还是先进先出。 4.堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。{堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。 class 鸭子{ private int age; private int weight; public 鸭子(int age,int weight){ this.age=age; this.weight=weight; } } 图例 : 文章来源: 堆栈之间的差别

Windbg -- 查看调用堆栈

匿名 (未验证) 提交于 2019-12-03 00:18:01
原文地址为: Windbg -- 查看调用堆栈 一. 显示堆栈信息 k* 命令 [~ Thread ] k[b |p| P |v] [c] [n] [f] [ L ] [ M ] [ FrameCount ] [~ Thread ] k[b |p| P |v] [c] [n] [f] [ L ] [ M ] = BasePtr [ FrameCount ] [~ Thread ] k[b |p| P |v] [c] [n] [f] [ L ] [ M ] = BasePtr StackPtr InstructionPtr [~ Thread ] kd [ WordCount ] 参数: Thread: b: p: P: p 。不同之处在于,每个参数显示在单独的行上面。 n: FrameCount: 二. 切换到指定帧信息 调用堆栈显示出来之后,如果想知道调用某帧时的相关信息,可以使用 .frame 来切换到指定的帧,然后就可以使用如 dv 命令显示局部变量等。 .frame [/c] [/r] [FrameNumber] /r: FrameNumber: 函数的调用过程以及入栈出栈顺序可以参考: 从汇编的角度分析函数调用过程(1) 从汇编的角度分析函数调用过程(2) 转载请注明本文地址: Windbg -- 查看调用堆栈 文章来源: Windbg -- 查看调用堆栈

浅谈汇编(2)――堆栈指令

匿名 (未验证) 提交于 2019-12-03 00:18:01
8086CPU提供入栈和出栈指令: (最基本的) PUSH(入栈) push ax:将寄存器ax中的数据送入栈中; POP (出栈) pop ax :从栈顶取出数据送入ax。 8086CPU的入栈和出栈操作都是以 字 (两个字节)为单位进行的。 8086CPU中,有两个寄存器: 段寄存器SS  存放栈顶的段地址 寄存器SP  存放栈顶的偏移地址 任意时刻,SS:SP指向栈顶元素。 问题:如果我们将10000H~1000FH 这段空间当作栈,初始状态栈是空的,此时,SS=1000H,SP=? 答:SP = 0010H 我们将10000H~1000FH 这段空间当作栈段,SS=1000H,栈空间大小为16 字节 ,栈最底部的字单元地址为1000:000E。  任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS = 1000H,SP= 000EH 。 push ax(入栈) (2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。 pop ax (1)将SS:SP指向的内存单元处的数据送入ax中; (2)SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。 push 指令的执行过程 pop指令的执行过程 注意: 出栈后,SS:SP指向新的栈顶1000EH,pop操作前的栈顶元素,1000CH 处的2266H 依然存在

c++中关于堆和堆栈的区别

匿名 (未验证) 提交于 2019-12-03 00:15:02
转载https://www.cnblogs.com/sea-stream/p/11361476.html new&delete和malloc&free的联系与区别 new和malloc都是申请内存空间,分配的空间都在堆存储区。 new的时候会初始化内存空间,而malloc只是申请了内存空间,不进行初始化;同时,delete会调用析构函数,而free只是释放内存空间,指针还在(因此free之后,还需要设置指针为NULL)。 malloc&free是C/C++的标准库函数,而new&delete是C++的运算符。 来源:博客园 作者: 乐呵的太阳 链接:https://www.cnblogs.com/happytaiyang/p/11764069.html

自学QT之堆栈窗口

匿名 (未验证) 提交于 2019-12-03 00:03:02
堆栈窗口也是一类使用广泛的窗口,只不过名字叫起来似乎很高端罢了。 新建一个项目,取消界面选项。类名是stackdlg 接下来在.cpp文件中添加以下代码: #include "stackdlg.h" #include < QHBoxLayout > StackDlg :: StackDlg ( QWidget * parent ) : QDialog ( parent ) { setWindowTitle ( "stackedwidget" ); list = new QListWidget ( this ); list -> insertItem ( 0 , "window1" ); list -> insertItem ( 1 , "window2" ); list -> insertItem ( 2 , "window3" ); label1 = new QLabel ( "window1" ); label2 = new QLabel ( "window2" ); label3 = new QLabel ( "window3" ); stack = new QStackedWidget ( this ); stack -> addWidget ( label1 ); stack -> addWidget ( label2 ); stack -> addWidget (

traceback说明

匿名 (未验证) 提交于 2019-12-02 23:55:01
一:traceback说明 该模块提供了一个标准接口来提取,格式化和打印Python程序的堆栈跟踪。它完全模仿Python解释器在打印堆栈跟踪时的行为。当您想要在程序控制下打印堆栈跟踪时,这很有用。 二:模块定义了以下功能: traceback . print_tb ( tb [, limit [, file ] ] ) 打印以限制回溯对象 tb 的堆栈跟踪条目。如果 省略限制或者 None 打印所有条目。如果文件被省略或者 None 输出到了 sys . stderr ; 否则它应该是一个打开的文件或文件类对象来接收输出。 traceback . print_exception ( etype , value , tb [, limit [, file ] ] ) 打印异常信息,并将 traceback tb 中的堆栈跟踪条目限制为文件。这与以下方面有所不同:( 1 )如果 tb 不是,则打印一个标题; ( 2 )在堆栈跟踪之后打印异常 etype 和值 ; ( 3 )如果 etype 的值和值具有适当的格式,则会打印语法错误发生的行,并在其中指出错误的大概位置。 print_tb () NoneTraceback ( most recent call last ): SyntaxError traceback . print_exc ([ limit [, file ] ] )

c++中关于堆和堆栈的区别

匿名 (未验证) 提交于 2019-12-02 23:54:01
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量 的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应 用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉, 那么在程序结束后,操作系统会自动回收。 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的, 不过它是用free来结束自己的生命的。 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的 C语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变 量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被 初始化的对象存储区可以通过void*来访问和操纵,程序结束后由系统自行释 放),在C++里面没有这个区分了,他们共同占用同一块内存区。 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许 修改(当然,你要通过非正当手段也可以修改,而且方法很多) 堆和栈究竟有什么区别? 主要的区别由以下几点: 1、管理方式不同; 2、空间大小不同; 3、能否产生碎片不同; 4、生长方向不同; 5、分配方式不同; 6、分配效率不同; 管理方式:对于栈来讲,是由编译器自动管理

编译原理初解

匿名 (未验证) 提交于 2019-12-02 23:49:02
词法分析器事作为编译的第一阶段,词法分析器的主要任务是读入源程序的输入字符,将他们组成词素,生成并输出一个词法单元token序列 一个计算器的主要token序列 词法分析器的主要功能就是读入源程序,再作为统一的token序列输出 public static final int EOI = 0 ; public static final int SEMI = 1 ; public static final int PLUS = 2 ; public static final int TIMES = 3 ; public static final int LP = 4 ; public static final int RP = 5 ; public static final int NUM_OR_ID = 6 ; public static final int WHITE_SPACE = 7 ; public static final int UNKNOWN_SYMBOL = 8 ; public static final int SUB = 9 ; 文法用来描述语言的规则,文法G定义为一个四元组(VN,VT,P,S),其中,VN为非终结符集合,VT终结符集合;P是产生式结合;S称为识别符或开始符号,也是一个非终结符,至少要在一条产生式的左边出现。

函数调用堆栈

匿名 (未验证) 提交于 2019-12-02 23:46:01
c++ c++程序调用内核堆栈的呢? CPU cpu 回想这个时先回想一下虚拟空间的空间布局和调用约定 int sum int a int b { tmp=a+b; return tmp; } int main() { int b=20; ret=sum(a,b); Printf(“%d”,ret); } 1G 3G 128M 0x00000000 -- 0x0804 8000 .text .data .bss未初始化 (执行前清 0 heap 共享库 stack 环境变量 0xc000 0000 DMA NORMAL HIGHMEM 0xffff ffff 函数调用的具体情况: Push pop eax ebx ebp esp call 4 eax 8 具体实现如下: tmp main ebp 下一条指令的地址 ( &&printf X X X X X X X X X X mainCRTstartup 关于四种调用约定: pasclcall _cdecl c _stdcall windows _fastcall 1) _stdcall 2)4 stdcall _thiscall c++ // c++ c c++ c++ / text 栈:局部变量,参数,编译器自动开辟释放,相当于计算机系统的数据结构分配专门的寄存器来存储栈的地址,所以效率较高,内存空间连续,但由于向下开辟

汇编学习1--寄存器学习

匿名 (未验证) 提交于 2019-12-02 23:42:01
最近发现底层原理知识匮乏,故而重故一下汇编, 以便对系统攻防技术有更好的理解 下图是80X86寄存器整体图示: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 作用:寄存器是 中央处理器 内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存 指令 、 数据 和 地址 。在 中央处理器 的控制部件中,包含的寄存器有 指令寄存器 (IR)和 程序计数器 (PC)。在 中央处理器 的算术及逻辑部件中,寄存器有 累加器 (ACC) (来自百科) 下面对各类寄存器进行介绍: 1. 数据寄存器 作用:数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间 寄存器中数据存储: 在内存中时,由于内存单元是字节单元,刚一个字要用2个地址连续的内存单元来存放,字的低位字节存在低地址单元. 0地址单元中存放的字节型数据为20H,0地址单元中存放的字型数据为4E20H,2地址单元中存放的字节型数据为12H,2地址单元中存放的字型数据为0012H 汇编命令: 2.段寄存器 作用 : 段寄存器 是因为对内存的分段管理而设置的。计算机需要对内存分段,以分配给不同的程序使用