zoukankan      html  css  js  c++  java
  • c语言中通过指针将数值赋值到制定内存地址

    1.一种直观的方法

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

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

    1 int *p = (int *)0x12ff7c;
    2 *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;
  • 相关阅读:
    一、入门实例
    十四、事物配置
    JAVA-调用http链接
    ORACLE 年龄计算到月份
    ORACLE和MYSQL 去重查询
    JAVA--将图片转为BASE64编码并返回thymeleaf页面
    JAVA--将图片保存至项目路径
    java--获取类加载路径和项目根路径
    excel执行INSERT和UPDATE操作语句
    c# 未能加载Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342
  • 原文地址:https://www.cnblogs.com/huangyangquan/p/10642097.html
Copyright © 2011-2022 走看看