【发布时间】:2020-05-13 21:05:38
【问题描述】:
我想要两个独立的 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; 处导入不同的内存地址,其他地址被正确读取并显示与作弊引擎显示的相同值。
我使用 Sublime Text 3 作为编译器,但我也尝试了 CodeBlocks 和 Visual Studio 2019,结果没有改变。
【问题讨论】:
-
访问另一个程序的内存比这困难得多。对于初学者,请阅读virtual memory。
-
上述代码中不需要续行反斜杠。 (也没有什么坏处。只是通常会省略,除非在需要的代码区域。)
-
您可能想要使用 Boost 的 shared memory 工具。我假设正在编写这两个程序以合作共享内存。
-
程序要求被借出内存,而他们得到的内存实际上是他们的,至少不用做更困难的事情。遗憾的是,这永远不会奏效。
-
好的,谢谢,所有这些都很有帮助,但我不明白为什么我能够输入在第二个程序中寻址的其他内存并且仍然可以读取该内存中的数据。 @eljay