晚上好。
我打开了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
的工作原理。这就是我想要的原因:
- 打开第一个程序,初始化变量,写下它的地址;
- 打开第二个程序并修改与
相关的书面地址- 在第一个程序中写入变量以检查一切是否正常。
答案 0 :(得分:9)
...我打开了Visual Studio的另一个副本......
并存在你的问题。所有现代系统都使用virtual memory,这意味着不允许一个进程触及另一个进程的虚拟地址空间。这是由处理器强制执行的。
你可以潜在地在同一个进程(程序)中执行此操作。但是,现代操作系统还启用ASLR(地址空间布局随机化),这意味着每次执行程序时,一段代码或数据可能会加载到不同的虚拟地址。
如果您想访问其他进程的内存,最好的办法是使用您的操作系统debugging APIs。具体来说,在Windows上,您可以拨打WriteProcessMemory
。
如果你只想玩volatile
(内存可能会从你下面改变),你应该考虑产生另一个线程,它会定期修改一个全局可访问的变量。< / p>