zoukankan      html  css  js  c++  java
  • 如何将数值存储到指定的内存地址

      假设现在需要往内存地址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 类型的数据;然后通过钥匙“*”向这块内存写入一个数据。

      

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

  • 相关阅读:
    玄学最短路算法——Ex Floyd
    题解 CF785E 【Anton and Permutation】
    题解 P1825 【[USACO11OPEN]玉米田迷宫Corn Maze】
    实现非递归树链剖分
    题解 P3423 【[POI2005]BAN-Bank Notes】
    题解 P3871 【[TJOI2010]中位数】
    【带修改的主席树】理解题解 (P2617 【Dynamic Rankings】题解)
    快速计算高精乘低精---低精优化高精
    了解 yaml文件格式
    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.ac_flight' doesn't exist
  • 原文地址:https://www.cnblogs.com/doitjust/p/11318208.html
Copyright © 2011-2022 走看看