如何将数值存储到指定的内存地址

  假设现在需要往内存地址0x12ff7c上存入一个整型数0x100,那么怎样才能做到呢?

  我们知道可以通过一个指针向其指向的内存地址写入数据,那么这里的内存地址0x12ff7c其本质不就是一个指针嘛,所以我们可以用下面的方法:

int *p = (int *)0x12ff7c;
*p = 0x100;

  需要注意的是,将地址0x12ff7c赋值给指针变量p的时候必须强制转换。

  这里只选择内存地址0x12ff7c而不选择别的地址,比如0xff00等,仅仅是为了方便在Visual C++ 6.0上测试而已。如果选择0xff00,那么在执行“*p=0x100;”这条语句的时候,编译器可能会报告一个内存访问的错误,因为地址0xff00处的内存可能你并没有权力去访问。出现一个问题,我们怎么知道一个内存地址是否可以合法地被访问呢?也就是说怎样知道0x12ff7c处的内存是可以别访问的呢?其实这很简单,我们可以先定义一个变量i,比如: int i = 0 变量i所处的内存肯定是可以被访问的;然后在调试器的Watch窗口上观察&i的值就知道其内存地址了。这里我得到的地址是0x12ff7c,仅此而已(不同的编译器可能每次给变量i分配的内存地址不一样,但Visual C++ 6.0 刚好每次都一样)。你完全可以给任意一个可以被合法访问的其他地址赋值,得到这个地址后再把 int i = 0; 这句代码删除,一切“罪证”被销毁得一干二净。

  

  除了这样就没有别的方法了吗?未必。我们甚至可以直接这么写代码:

*(int *)0x12ff7c = 0x100;

  这行代码其实和上面的两行代码没有本质的区别。先将地址0x12ff7c强制转换,告诉编译器这个地址上将存储一个 int 类型的数据;然后通过钥匙“*”向这块内存写入一个数据。

  

  上面讨论了这么多,目的就是告诉大家,其实其表达形式并不重要,重要的是这种思维方式,也就是说我们完全由办法给指定的某个内存地址写入数据。

猜你喜欢

转载自www.cnblogs.com/doitjust/p/11318208.html