提问者:小点点

在一个运行中的程序中访问变量和它们的值是可能的吗(C++)


用C++访问另一个程序在运行时使用的变量是否可能? 例如,我有一个程序,它总是将变量a更改1,我想创建另一个程序并访问a变量及其值。


共1个答案

匿名用户

是的,在另一个程序中访问变量是可能的,前提是:

  • 变量不在“堆栈”上。
  • 变量不在寄存器中。
  • 该程序与您的程序同时运行。
  • 变量驻留的内存页在内存中,尚未“分页”到硬盘驱动器(即虚拟内存)。

通常,需要在程序之间共享的变量被放入“共享内存”,即两个或更多进程可以访问的内存区域。

共享变量需要有一个保护方案,以便只有一个进程写入变量,并且在写入变量时不读取变量。

您需要在互联网上搜索“C++windows共享内存示例”,因为这个概念很大,适合于StackOverflow答案。

编辑:堆栈变量
从技术上讲,您可以访问另一个程序堆栈上的变量,前提是该堆栈位于内存中的可寻址区域(某些处理器具有外部程序不可寻址的内部堆栈)。

问题在于时机。 许多用C++编写的程序将局部变量放在堆栈中函数或语句块的开头(如if语句或while循环)。 在执行离开语句块的作用域后,变量将消失。 因此,您的程序必须有很好的时间来确定变量何时在堆栈上(希望此时您的程序正在运行)。 虽然,操作系统可以将另一个程序交换到硬盘驱动器,而您的程序运行在相同的内存空间。 在这种情况下,您将无法访问其他程序的变量。

寄存器变量很少处理器有内存映射的寄存器。 大多数处理器的寄存器没有地址。 此外,您的程序可能使用相同的寄存器。 通常,操作系统会“冻结”另一个程序,将其寄存器和堆栈写入内存或硬盘驱动器中的某个区域。 然后你的程序将被加载到内存中(也就是你的程序的变量和堆栈空间将被恢复),你的程序将在它停止的地方执行。 这向您展示了其他程序中变量在时间和访问上的困难。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(运行|中|程序|中|访问|变量|值|c++)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?