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 类型的数据;然后通过钥匙“*”向这块内存写入一个数据。

      

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

  • 相关阅读:
    sp2010 升级sp2013 用户无法打开网站
    powerviot install in sharepoint 2013
    can not connect cube in performancce dashboard
    westrac server security configure user info
    添加报表服务在多服务器场
    sharepoint 2013 office web app 2013 文档在线浏览 IE11 浏览器不兼容解决方法
    delete job definition
    目前付款申请单内网打开慢的问题
    item style edit in sharepoint 2013
    Could not load file or assembly '$SharePoint.Project.AssemblyFullName$'
  • 原文地址:https://www.cnblogs.com/doitjust/p/11318208.html
Copyright © 2011-2022 走看看