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.变量的初始值
- 全局变量是可以没有初始值而直接使用的
- 局部变量在使用前必须要赋值