【问题标题】:C++, how to access with a pointer to a specific addressC ++,如何使用指向特定地址的指针进行访问
【发布时间】:2022-01-24 00:46:13
【问题描述】:

我很好奇,所以我尝试这样做:

第一个程序:

#include <iostream>

using namespace std;

int a = 5;

int main()
{
    
    cout << "Value of a: " << a << endl;
    cout << "Address of a: " << &a << endl;
    
    system("pause");
    
    return 0;
}

输出:

  • a 的值:5
  • a的地址:0x472010

第二个节目:

#include <iostream>

using namespace std;

int* p = reinterpret_cast<int*>(0x472010);
    
int main() 
{   
    cout << "Value of p: " << *p << endl;
    cout << "The address that the pointer points to: " << p << endl;
    
    cout << endl;
    
    system("pause");
    return 0;
}

所以,我想读取变量“a”的值 'p' 指针属于另一个程序,'p' 指针指向特定地址。

在我运行第二个程序之前一切都很好,因为第二个程序没有给出想要的结果

输出第二个程序:

  • p 值:4661264
  • 指针指向的地址:0x472010

如果我保持第一个程序的窗口打开,结果不会改变。

我保证我是初学者,我正在尝试新事物

我做错了什么?

【问题讨论】:

  • FWIW,每次运行程序时,地址都会改变。见en.wikipedia.org/wiki/Address_space_layout_randomization
  • 在 90 年代,这种事情在 16 位 Windows 上是可能的。由于任何程序都可能破坏另一个程序(或操作系统本身)的内存,因此系统的稳定性受到损害,并且每天多次重新启动计算机是很常见的。今天,错误的代码很少影响其他应用程序,因为一个进程无法访问其他进程的内存。

标签: c++ pointers


【解决方案1】:

您无法以您尝试的方式直接访问另一个进程的内存。每个进程都在自己的地址空间中运行。您的第二个进程正在尝试访问其自己的地址空间内的(无效)地址,而不是第一个进程的地址空间内。

在 Windows 上,要读取另一个进程的内存,您的第二个进程必须从第一个进程中获取HANDLE,例如从OpenProcess(),然后必须使用ReadProcessMemory() 从第一个进程内的地址读取内存.

另一种方法是让第一个进程分配一块共享内存,第二个进程可以直接访问该块。在 Windows 上,您可以为此使用 CreateFileMapping()MapViewOfFile()(请参阅 MSDN 上的 Creating Named Shared Memory)。在 'Nix 系统上,您可以使用 shm_open() mmap()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多