c语言中通过指针将数值赋值到制定内存地址

1.一种直观的方法

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

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

int *p = (int *)0x12ff7c;

*p = 0x100;

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

1.1 为什么在此处,我们敢往0x12ff7c这个地址赋值呢?

  至于这里为什么选择内存地址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;”这句代码删除。一切“罪证”销毁得一干二净,简直是做得天衣无缝。

2.另一个方法

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

*(int *)0x12ff7c = 0x100;

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

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

posted @ 2015-10-26 19:45  程序员修练之路  阅读(577)  评论(0编辑  收藏  举报