gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:06 25 4
gpt4 key购买 nike

晚上好。

我打开 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;

但是它产生了异常

Project2.exe 中 0x00A943DD 处的未处理异常:0xC0000005:访问冲突读取位置 0x003CFBF8。

这是什么意思?我没有权限?我做错了吗?

如果你问我为什么要这样做,我正在通过一些书籍学习 C++,我想检查一下 volatile 是如何工作的。这就是为什么我想:

  • open first program, initialize variable, write it's address;
  • open second program and modify what written address relates to
  • write variable in first program to check if everything is okay.

最佳答案

... I opened another copy of Visual Studio ...

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

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

如果你想访问另一个进程的内存,最好的办法可能是使用操作系统的 debugging APIs .具体来说,在 Windows 上您可以调用 WriteProcessMemory .

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

关于c++ - 如何在 C++ 中修改知道内存地址的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22918134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com