如何在c ++中修改知道内存地址的对象?

时间:2014-04-07 16:35:22

标签: c++ visual-studio-2012 memory-management

晚上好。

我打开了Visual Studio 2012并运行程序:

    double x = 8768130;
    cout << &x;

    cin.get();
    return 0;

在控制台中写的地址为003CFBF8

然后,我打开了Visual Studio的另一个副本并尝试阅读此内容,但我不确定我是否正确执行此操作。在发布之前我已经在Stack Overflow中搜索并发现我应该这样做:

    double* ptr = reinterpret_cast<double*>(0x003CFBF8);

    cout << *ptr;

但它产生了异常

Unhandled exception at 0x00A943DD in Project2.exe: 0xC0000005: Access violation reading location 0x003CFBF8.

这是什么意思?我无法访问?我做错了吗?

如果你问我为什么要这样做,我正在从一些书中学习C ++,我想检查volatile的工作原理。这就是我想要的原因:

  
      
  • 打开第一个程序,初始化变量,写下它的地址;
  •   
  • 打开第二个程序并修改与
  • 相关的书面地址   
  • 在第一个程序中写入变量以检查一切是否正常。
  •   

1 个答案:

答案 0 :(得分:9)

  

...我打开了Visual Studio的另一个副本......

并存在你的问题。所有现代系统都使用virtual memory,这意味着不允许一个进程触及另一个进程的虚拟地址空间。这是由处理器强制执行的。

你可以潜在地在同一个进程(程序)中执行此操作。但是,现代操作系统还启用ASLR(地址空间布局随机化),这意味着每次执行程序时,一段代码或数据可能会加载到不同的虚拟地址。

如果您想访问其他进程的内存,最好的办法是使用您的操作系统debugging APIs。具体来说,在Windows上,您可以拨打WriteProcessMemory

如果你只想玩volatile(内存可能会从你下面改变),你应该考虑产生另一个线程,它会定期修改一个全局可访问的变量。< / p>