假设现在需要往内存 0x12ff7c 地址上存入一个整型数 0x100。我们怎么才能做到呢?我 们知道可以通过一个指针向其指向的内存地址写入数据,那么这里的内存地址 0x12ff7c 其 本质不就是一个指针嘛。所以我们可以用下面的方法:
int *p = (int *)0x12ff7c;
*p = 0x100;
需要注意的是将地址 0x12ff7c 赋值给指针变量 p 的时候必须强制转换。至于这里为什
么选择内存地址 0x12ff7c,而不选择别的地址,比如 0xff00 等。这仅仅是为了方便在 Visual C++ 6.0 上测试而已。如果你选择 0xff00,也许在执行*p = 0x100;这条语句的时候,编译器 会报告一个内存访问的错误,因为地址 0xff00 处的内存你可能并没有权力去访问。既然这 样,我们怎么知道一个内存地址是可以合法的被访问呢?也就是说你怎么知道地址 0x12ff7c 处的内存是可以被访问的呢?其实这很简单,我们可以先定义一个变量 i,比如:
inti = 0;
变量 i 所处的内存肯定是可以被访问的。然后在编译器的 watch 窗口上观察&i 的值不就 知道其内存地址了么?这里我得到的地址是 0x12ff7c,仅此而已(不同的编译器可能每次给 变量 i 分配的内存地址不一样,而刚好 Visual C++ 6.0 每次都一样)。你完全可以给任意一个 可以被合法访问的地址赋值。得到这个地址后再把“int i = 0;”这句代码删除。一切“罪证”
销毁得一干二净,简直是做得天衣无缝。 除了这样就没有别的办法了吗?未必。我们甚至可以直接这么写代码: *(int *)0x12ff7c = 0x100;
这行代码其实和上面的两行代码没有本质的区别。先将地址 0x12ff7c 强制转换,告诉编译 器这个地址上将存储一个 int 类型的数据;然后通过钥匙“*”向这块内存写入一个数据。
上面讨论了这么多,其实其表达形式并不重要,重要的是这种思维方式。也就是说我 们完全有办法给指定的某个内存地址写入数据的。 |
|