变量

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.变量的初始值

  • 全局变量是可以没有初始值而直接使用的
  • 局部变量在使用前必须要赋值
原文地址:https://www.cnblogs.com/codexlx/p/13348138.html