Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内存地址会改变吗?如何动态找到它们?_C++_Process_Memory Address - Fatal编程技术网

C++ 内存地址会改变吗?如何动态找到它们?

C++ 内存地址会改变吗?如何动态找到它们?,c++,process,memory-address,C++,Process,Memory Address,我正在写一个简单的程序来访问另一个进程的内存。我一直在使用内存编辑器来查找希望程序检索并与ReadProcessMemory函数一起使用的变量的地址。到目前为止,还没有出现任何问题,但我不确定这些值的地址是否会根据其他程序运行的环境而变化 除了对程序本身的修改之外,我还应该关心这个问题吗?我注意到我的内存编辑器保存了与.exe(如.exe +exf+1986)的位置有关的地址,我很想实现这样的程序,但是我找不到任何方法来检索C++中的.exe的当前地址。< /p> < p>是的,它们改变了。 操

我正在写一个简单的程序来访问另一个进程的内存。我一直在使用内存编辑器来查找希望程序检索并与ReadProcessMemory函数一起使用的变量的地址。到目前为止,还没有出现任何问题,但我不确定这些值的地址是否会根据其他程序运行的环境而变化

除了对程序本身的修改之外,我还应该关心这个问题吗?我注意到我的内存编辑器保存了与.exe(如.exe +exf+1986)的位置有关的地址,我很想实现这样的程序,但是我找不到任何方法来检索C++中的.exe的当前地址。< /p> < p>是的,它们改变了。 操作系统每次启动时都会将进程加载到不同的偏移量中,分配给
new
malloc
的任何内容都很可能在每次运行代码时获得不同的地址。

是的,它们会改变


操作系统每次启动时都会将进程加载到不同的偏移量中,并且每次运行代码时,分配给
new
malloc
的任何内容都很可能得到不同的地址。

是的,它们会改变。编写一个程序,输出几个变量的内存地址并运行几次。每次输出都应该不同,特别是在其他机器上。

是的,它们会改变。编写一个程序,输出几个变量的内存地址并运行几次。每次的输出都应该不同,尤其是在其他机器上。

对同一内存区域的多次访问也会遇到并发问题

顺序正确-W1a、W1b、R1a、R1b、W2a、W2b、R2a、R2b 顺序不正确-W1a、W1b、R1a、W2a、W2b、R1b、R2a、R2b

要解决此问题,您需要了解IPC,处理器间通信:

对于同一内存区域的多次访问,您还将遇到并发问题

顺序正确-W1a、W1b、R1a、R1b、W2a、W2b、R2a、R2b 顺序不正确-W1a、W1b、R1a、W2a、W2b、R1b、R2a、R2b

要解决此问题,您需要了解IPC,处理器间通信:
这里有两个问题:变量在进程内存空间中的位置,以及进程在物理内存中的位置。第一个应该和你有关,第二个不应该

局部变量(以及全局/静态变量)相对于内存中的程序位置具有相同的地址。动态分配的变量(new/malloc)每次都有不同的地址

当我说“内存”时,我指的是特定进程的虚拟内存空间:一个进程中的地址0x100不等于另一个进程中的地址0x100,并且通常不同于RAM中的单元号0x100。 实际地址通常并不有趣,因为ReadProcessMemory和内存编辑器都只处理这些相对地址。您不需要program.exe的位置


如果您对局部变量感兴趣,可以指望ReadProcessMemory每次都返回有意义的结果。如果您需要动态分配的内存,则需要找到一个本地指针,从中获取分配内存的地址,然后再次调用ReadProcessMemory。

这里有两个问题:进程内存空间中变量的位置,以及进程在物理内存中的位置。第一个应该和你有关,第二个不应该

局部变量(以及全局/静态变量)相对于内存中的程序位置具有相同的地址。动态分配的变量(new/malloc)每次都有不同的地址

当我说“内存”时,我指的是特定进程的虚拟内存空间:一个进程中的地址0x100不等于另一个进程中的地址0x100,并且通常不同于RAM中的单元号0x100。 实际地址通常并不有趣,因为ReadProcessMemory和内存编辑器都只处理这些相对地址。您不需要program.exe的位置


如果您对局部变量感兴趣,可以指望ReadProcessMemory每次都返回有意义的结果。如果您需要动态分配的内存,则需要找到一个本地指针,从中获取分配内存的地址,然后再次调用ReadProcessMemory。

谢谢。它们相对于.exe的地址会保持不变吗?这取决于编译器,但在大多数情况下,我希望静态变量与可执行映像的偏移量保持不变。堆栈或堆分配的更不可预测谢谢。它们相对于.exe的地址会保持不变吗?这取决于编译器,但在大多数情况下,我希望静态变量与可执行映像的偏移量保持不变。堆栈或堆分配的更不可预测,到目前为止,它一直在我的台式机和笔记本电脑上工作。我想这可能与我正在访问的程序是如何编写的有关。到目前为止,它一直在我的台式机和笔记本电脑上运行。我想这可能与我正在访问的程序是如何编写的有关。