gpt4 book ai didi

C++ 指针读取内存为 0

转载 作者:行者123 更新时间:2023-12-02 10:32:21 25 4
gpt4 key购买 nike

我想要两个独立的 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 显示的相同值。

我使用 Sublime Text 3 作为编译器,但我也尝试了 CodeBlocks 和 Visual Studio 2019,结果没有改变。

最佳答案

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

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

多处理操作系统通常还为进程提供一种或多种通信方式。 C++ 标准库没有这种能力。因此,您需要查阅系统文档来实现此类通信。第一步是找出你的目标系统。

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

关于C++ 指针读取内存为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61784820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com