• 变量


    C语言中的一个变量,就相当于一块内存

    1.声明变量:

    变量类型 变量名
    int x

    变量类型用来说明变量的大小:

      int——4字节

      short——2字节

      char——1字节

    变量名要求:

      字母、数字、下划线组成,第一个只能以字母或者下划线开头

      不能用C语言的关键字

      区分大小写

    2.全局变量

    全局变量在声明的时候没有放在任何一个函数的里边

    在汇编中,变量名就是一个内存地址编号:

    int x;     
    
    void main() {
        x = 1;
    
        return;
    }

     反汇编代码:

      

    可以看到,x这个变量就是一个内存地址037A138的编号,这个地址里面存的就是定义的值1。且这个内存的大小就是4个字节,一个DWORD(双字)

    这里的VS编译器为了方便阅读,显示成这样。

    全局变量的特点:

    • 编译的时候就已经确定了内存地址和宽度,变量名就是内存地址的别名
    • 如果不重新编译,全局变量的内存地址不会改变。游戏外挂中的找基址,其实就是找全局变量
    • 全局变量中的值任何变量都可以改,是公用的

    示例:一个循环输出一个数字的程序,编译成exe文件:

    C程序:

    #include <stdio.h>
    #include <windows.h>   // 头文件
    
    int x;     
    
    void main() {
        x = 1234567;
        while(1) {
            Sleep(3000);
            printf("%d
    ", x);
        }
        return;
    }

     运行编译后的exe文件:

      此时这个程序会循环输出数字1234567

    使用CE打开该exe文件,搜索具体数值1234567,会得到可能若干个结果:

      

    这里搜到的地址颜色是绿色的,说明搜到的是全局变量,这里直接在限免修改可以实现修改打印结果,跟修改单机游戏的游戏数值一样:

      

    3.局部变量

    • 局部变量是函数内部申请的,如果函数没有执行,那么局部变量没有内存空间
    • 局部变量的内存是在堆栈中分配的,程序执行时才分配。我们无法预知程序何时执行,这也意味着,我们无法确定局部变量的内存地址
    • 因为局部变量地址内存是不确定的,所以局部变量只能在函数内部使用,其他函数不能使用(第一篇中有介绍)

    此时用CE搜索的话是搜索不到的,因为函数还没有执行,还没有为这个变量分配内存空间;

    且如果函数立即执行结束,这时搜的话可能还是搜索不到,因为马上释放了

    4.变量的初始值

    • 全局变量是可以没有初始值而直接使用的
    • 局部变量在使用前必须要赋值
  • 相关阅读:
    android高级页面效果集锦
    2018年Android的保活方案效果统计
    程序员如何预估自己的项目开发时间?
    Google开发者大会:你不得不知的Tensorflow小技巧
    练就Java24章真经—你所不知道的工厂方法
    一个完整Java Web项目背后的密码
    怎么捕获和记录SQL Server中发生的死锁
    使用跟踪标志位分析死锁
    通过SQL Server Profiler来监视分析死锁
    SQL Server中的死锁
  • 原文地址:https://www.cnblogs.com/codexlx/p/13348138.html
Copyright © 2020-2023  润新知