C++ 指针读取内存为 0
Posted
技术标签:
【中文标题】C++ 指针读取内存为 0【英文标题】:C++ Pointer Reads Memory As 0 【发布时间】: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 【参考方案1】:C++ 语言没有进程的概念。就语言而言,当前运行的程序是唯一存在的。程序之间除了通过标准输入输出或读写文件外,没有任何通信。
不过,操作系统(现在)确实支持同时运行多个程序。它们通过虚拟内存实现 C++ 程序感知的隔离。一个程序中的内存地址对另一个程序没有意义。
多处理操作系统通常还为进程提供一种或多种通信方式。 C++ 标准库没有这种能力。因此,您需要查阅系统文档来实现此类通信。第一步是找出您的目标系统。
如果读者有足够的权限,系统甚至可能是一个 API 直接读取另一个进程的内存,我认为这就是你想要做的。然而,找到相关地址通常很困难,因为操作系统通常会实施地址空间布局随机化以防止安全漏洞。大多数进程间通信是合作的。
【讨论】:
以上是关于C++ 指针读取内存为 0的主要内容,如果未能解决你的问题,请参考以下文章
Linux中多个进程使用文件指针读取文件时是不是使用共享虚拟内存?