C++指针读取内存为0

问题描述 投票:0回答:1

我想有两个独立的C++程序,第一个程序初始化一个整数并改变其值,第二个程序通过给定的指针从第一个程序中读取一个整数的值。第一个程序看起来是这样的。

#include <iostream>

int main() {
    int var = 5;
    int* varPtr = &var;

    std::cout << "var = " << var <<\
     " varPtr = " << varPtr <<\
     " (long long)varPtr = " << (long long)varPtr <<\
      " *varPtr = " << *varPtr << std::endl;

    for(int i = 0 ; i < 10 ; i ++) {
        std::cout << "enter a number: ";
        std::cin >> *varPtr;

        std::cout << "var = " << var <<\
         " varPtr = " << varPtr <<\
         " *varPtr = " << *varPtr << std::endl;
    }
}

第二个程序是这样的

#include <iostream>

int main() {
    std::cout << "enter (long long)varPtr (from the second program): ";
    int* varPtr = nullptr;
    long long llPtr = 0;
    std::cin >> llPtr;
    varPtr = (int*)llPtr;
    std::cout << "varPtr = " << varPtr <<\
    "\n*varPtr = " << *varPtr <<\
    " (long long)varPtr = " << (long long)varPtr << std::endl;
    while(true) {
        std::cout << " varPtr = " << varPtr <<\
         " *varPtr = " << *varPtr << std::endl;
    }
}

我知道第一个程序是可行的, 因为我用Cheat Engine检查了一个给定的内存地址的RAM值 而且这个值设置得很好. 问题是第二个程序将给定的内存地址的值读为0。std::cin >> llPtr; 和其他地址被正确读取,并显示出与Cheat Engine显示的相同的值。

我在使用 崇高的文字 3 作为编译器,但我也尝试了 代码块Visual Studio 2019,结果并没有改变。

c++ pointers sublimetext3
1个回答
0
投票

C++语言没有过程的概念。就该语言而言,当前运行的程序是唯一存在的程序。除了通过标准的输入和输出或读写文件,程序之间没有任何通信。

然而,操作系统(如今)确实支持同时运行多个程序。它们通过虚拟内存来实现C++程序所感知的隔离。一个程序中的内存地址对另一个程序是没有意义的。

多处理操作系统一般还提供了一种或多种进程通信的方式。C++标准库不具备这样的功能。因此,你需要查阅系统的文档来实现这种通信。第一步是找出你所针对的系统。

如果读取者有足够的权限,系统甚至可能是一个API来直接读取另一个进程的内存,我想这就是你要做的事情。然而,寻找相关地址通常是很困难的,因为操作系统通常会实现地址空间布局随机化,以防止安全漏洞。大多数进程间的通信都是合作性的。

© www.soinside.com 2019 - 2024. All rights reserved.