首页 > 解决方案 > 如何从内存中访问特定值

问题描述

我有以下代码:

int main {
    int* x = new int;
    *x = 5;
    std::string input = " ";
    while (true) {
        std::cin >> input;
        if (input == "show") {
            std::cout << *x << " " << x << "\n"; // Output value and address of x if "show" is the console input
        }
        else if (input == "exit") {    // Close the program if "exit" is the console input
            break;
        }
    }
    delete x;
}

此代码应输出 x 的值和地址。这看起来像这样:

5
0000020445E210E0

现在我需要另一个带有指向地址的指针的外部 c++ 程序,x以便它可以更改x. 但是我怎样才能创建一个指向这个确切地址的指针来改变值呢?

标签: c++pointersmemoryipc

解决方案


现在我需要另一个带有指向 x 地址的指针的外部 c++ 程序,以便它可以更改 x 的值。但是我怎样才能创建一个指向这个确切地址的指针来改变值呢?

你不能。在支持多处理的(现代)系统上,每个进程都有不同的虚拟内存空间,通常不能指向其他进程的内存。


一些替代方案:

  • 您可以在共享内存中创建一个动态对象。在 C++ 中没有分配共享内存的标准方法。
    • 通常,您需要某种形式的锁定来避免竞争条件。您可以使用进程间互斥体/信号量。C++ 中没有标准的进程间互斥体/信号量。
  • 您可以传递指向对象的值,而不是处理指针。以下所有替代方案都需要将数据序列化为字节流。C++ 中没有将任意数据序列化为字节流的标准方法。与此列表中的其他内容不同,序列化至少可以在不依赖任何操作系统接口的情况下实现。
    • 您可以使用管道。C++ 中没有创建管道的标准方法。
    • 您可以使用消息队列。C++ 中没有创建进程间消息队列的标准方法。
    • 网络套接字通常用于进程间通信。这允许通过网络进行通信,但也适用于同一系统上的进程之间。在 C++ 中没有标准的网络连接方式。
    • 您可以诉诸在一个进程中写入文件并在另一个进程中读取。虽然在标准 C++ 中可以进行文件访问,但没有标准的方法来锁定文件,这在多处理中避免竞争条件是必不可少的。在 C++ 中也没有标准的方法来获取更改文件的通知。

正如您可能已经从列表中注意到的那样,在 C++ 中根本没有用于 IPC 的标准方法。


推荐阅读