我想有两个独立的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++语言没有过程的概念。就该语言而言,当前运行的程序是唯一存在的程序。除了通过标准的输入和输出或读写文件,程序之间没有任何通信。
然而,操作系统(如今)确实支持同时运行多个程序。它们通过虚拟内存来实现C++程序所感知的隔离。一个程序中的内存地址对另一个程序是没有意义的。
多处理操作系统一般还提供了一种或多种进程通信的方式。C++标准库不具备这样的功能。因此,你需要查阅系统的文档来实现这种通信。第一步是找出你所针对的系统。
如果读取者有足够的权限,系统甚至可能是一个API来直接读取另一个进程的内存,我想这就是你要做的事情。然而,寻找相关地址通常是很困难的,因为操作系统通常会实现地址空间布局随机化,以防止安全漏洞。大多数进程间的通信都是合作性的。