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


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

      

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

  • 相关阅读:
    传真机换色带
    系统无法安装 OfficeControl.ocx 控件如何解决
    体系结构
    WebOffice 插件
    ArcMAP定义投影坐标
    如何在AutoCAD中将卫星底图变为有坐标参考信息的
    AutoCAD中导入图片
    CGCS2000坐标系与其他坐标系间的差异和转换方法
    FTP服务器(SOCKET)返回异常 500 Command not understood
    Java微信公众平台开发--番外篇,对GlobalConstants文件的补充
  • 原文地址:https://www.cnblogs.com/doitjust/p/11318208.html
Copyright © 2020-2023  润新知