《C++反汇编与逆向分析技术揭秘》笔记-第7章变量在内存中的位置和访问方式

若没有另外说明,都是运行在VS2022,x86,Debug下。


1.变量作用域
(1)全局变量属于进程作用域,在整个进程中都可以访问到。
(2)静态变量属于文件作用域,在当前源码文件内可以访问到。
(3)局部变量属于函数作用域,在函数内可以访问到。
(4)在'{ }'语句块内定义的变量属于块作用域,只能在该块内访问。


2.常量和全局变量异同
(1)相同:程序执行前就存在了,即在编译期就已经确定了地址。通过立即数访问。
(2)不同:在PE文件的只读数据节中,常量的节属性被修饰为不可写,而全局变量和静态变量则在属性为可读写的数据节中。


3.全局变量和局部变量区别
(1)生命周期不同(看上述1)。
(2)指令中寻址方式不同(看上述2(1)),而局部变量需要进入作用域内,通过申请栈空间存放,利用栈指针ebp或esp间接访问,其地址是一个未知可变值,编译器无法预先计算。
(3)地址顺序不同(看下面分析)。
(4)例子如下。分析:num1地址为0x005FA034,num2地址为0x0x005FA038,先定义的全局变量在低地址。n1地址为0x0048F89C,n2地址为0x0048F890,先定义的局部变量在高地址。


4.静态变量分为全局静态变量和局部静态变量。全局静态变量和全局变量在内存结构和访问原理上都是一样的,相当于全局静态变量等价于编译器限制外部源码文件访问的全局变量。


5.局部静态变量比较特殊,它与全局变量生命周期相同,但作用域不同。
(1)局部静态变量会预先被作为全局变量处理,而它的初始化部分只是做赋值操作而已。
(2)局部静态变量通过初始化标志保证只被初始化一次。
(3)当局部静态变量被初始化为常量值时,初始化过程中不会产生任何代码。即编译器直接以全局变量的方式进行处理,优化了代码,提升了效率。虽然转换为全局变量,但仍然不可以超出作用域访问。
(4)通过名称粉碎法,在编译期将静态变量重新命名,让其他作用域对局部静态变量不可见(即通过名称粉碎完成作用域的识别过程,函数重载也是如此)。
(5)例子如下。


6.堆变量,new与delete属于运算符,在没有定义重载的情况下,它们的执行过程与malloc、free类似。例子如下。


new的内部实现,使用new申请堆空间最终也会用到malloc。 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值