user-0 提问: 请问C语言可以使用另一个程序中的变量吗?比如我在程序1中使用指针分配了内存,现在我想打开程序2，输入程序1中这个指针的地址,然后在程序2中操作程序1中这个指针

回复:
user: user-1
content: ReadProcessMemory The ReadProcessMemory function reads memory in a specified process. The entire area to be read must be accessible, or the operation fails.   BOOL ReadProcessMemory(   HANDLE hProcess,  // handle to the process whose memory is read   LPCVOID lpBaseAddress,                     // address to start reading   LPVOID lpBuffer,  // address of buffer to place read data   DWORD nSize,      // number of bytes to read   LPDWORD lpNumberOfBytesRead                      // address of number of bytes read );

user: user-2
content: 引用 10 楼 u014602230 的回复:进程通信问题  操作系统相关书籍有介绍 引用 8 楼 yyxgs 的回复:[quote=引用 3 楼 lm_whales 的回复:] 这分几种情况 1）共享内存。不分彼此都可以用 2）古老的DOS 实模式。可以直接用 指针操作 3）Window 及其他现在操作系统      Window 提供了远程内存读写函数，可以操作别的程序的内存 4）另外，几乎所有调试器，都可以读写所加载程序的内存。 也许还有更多 ，例如通过驱动程序，操作别的程序的内存 另外，远程控制系统，可以通过网络连接， 控制另一台计算机进行任何操作，读写内存更不在话下了  能完成这些的也只有机器指令之上，高级语言之下的汇编了吧?   [/quote] 不是啊，只是用一些API而已， 通过变量名操作，只有共享内存也许还可以 其他的，都是通过API。 甚至驱动 对特定内存进行操作 一个程序的内存，另一个程序是能够操作的， 只是不能很直接操作而已， 因为每个程序的虚拟空间是自成一体的 操作系统对进程的空间作了隔离处理 因此需要特殊手段，来操作另一个程序的内存空间  一般来说1） 需要暂停（挂起） 被操作的程序中，影响到某个内存的线程 这样，就不会因为程序运行。导致数据不停的变来变去 2）需要从外部定位，读写这个程序的内存， 操作系统提供了API来解决这个问题

user: user-0
content: 引用 10 楼 u014602230 的回复:进程通信问题  操作系统相关书籍有介绍  多谢指点!

user: user-0
content: 引用 13 楼 u010165006 的回复:[quote=引用 6 楼 yyxgs 的回复:] [quote=引用 2 楼 u010165006 的回复:] 楼主需要了解一下进程、虚拟地址空间的概念。   请问从哪里了解?[/quote]  百度一下就可以了解了，如果想系统学习，需要看《操作系统》书，操作系统是计算机专业的必修课。[/quote]   多谢指点!

user: user-0
content: 引用 11 楼 lm_whales 的回复:[quote=引用 10 楼 u014602230 的回复:] 进程通信问题  操作系统相关书籍有介绍 引用 8 楼 yyxgs 的回复:[quote=引用 3 楼 lm_whales 的回复:] 这分几种情况 1）共享内存。不分彼此都可以用 2）古老的DOS 实模式。可以直接用 指针操作 3）Window 及其他现在操作系统      Window 提供了远程内存读写函数，可以操作别的程序的内存 4）另外，几乎所有调试器，都可以读写所加载程序的内存。 也许还有更多 ，例如通过驱动程序，操作别的程序的内存 另外，远程控制系统，可以通过网络连接， 控制另一台计算机进行任何操作，读写内存更不在话下了  能完成这些的也只有机器指令之上，高级语言之下的汇编了吧?   [/quote] 不是啊，只是用一些API而已， 通过变量名操作，只有共享内存也许还可以 其他的，都是通过API。 甚至驱动 对特定内存进行操作 一个程序的内存，另一个程序是能够操作的， 只是不能很直接操作而已， 因为每个程序的虚拟空间是自成一体的 操作系统对进程的空间作了隔离处理 因此需要特殊手段，来操作另一个程序的内存空间  一般来说1） 需要暂停（挂起） 被操作的程序中，影响到某个内存的线程 这样，就不会因为程序运行。导致数据不停的变来变去 2）需要从外部定位，读写这个程序的内存， 操作系统提供了API来解决这个问题 [/quote]   多谢指点!

user: user-3
content: 引用 6 楼 yyxgs 的回复:[quote=引用 2 楼 u010165006 的回复:] 楼主需要了解一下进程、虚拟地址空间的概念。   请问从哪里了解?[/quote]  百度一下就可以了解了，如果想系统学习，需要看《操作系统》书，操作系统是计算机专业的必修课。

user: user-4
content: 进程通信问题  操作系统相关书籍有介绍

user: user-0
content: 引用 7 楼 Rewen 的回复:可以看看windows编程之类的书籍。   Windows编程一般是用API吧?

user: user-0
content: 引用 3 楼 lm_whales 的回复:这分几种情况 1）共享内存。不分彼此都可以用 2）古老的DOS 实模式。可以直接用 指针操作 3）Window 及其他现在操作系统      Window 提供了远程内存读写函数，可以操作别的程序的内存 4）另外，几乎所有调试器，都可以读写所加载程序的内存。 也许还有更多 ，例如通过驱动程序，操作别的程序的内存 另外，远程控制系统，可以通过网络连接， 控制另一台计算机进行任何操作，读写内存更不在话下了  能完成这些的也只有机器指令之上，高级语言之下的汇编了吧?

user: user-5
content: 可以看看windows编程之类的书籍。

user: user-0
content: 引用 2 楼 u010165006 的回复:楼主需要了解一下进程、虚拟地址空间的概念。   请问从哪里了解?

user: user-0
content: 引用 4 楼 qq423399099 的回复:打印出来的地址值是逻辑地址，它是相对于你当前进程数据段的地址，不和绝对物理地址相干。只有在Intel实模式下，逻辑地址才和物理地址相等（因为实模式没有分段或分页机制,Cpu不进行自动地址转换）  WriteProessMemory   那我想获取实地址只有用汇编了吗?

user: user-6
content: 打印出来的地址值是逻辑地址，它是相对于你当前进程数据段的地址，不和绝对物理地址相干。只有在Intel实模式下，逻辑地址才和物理地址相等（因为实模式没有分段或分页机制,Cpu不进行自动地址转换）  WriteProessMemory

user: user-2
content: 这分几种情况 1）共享内存。不分彼此都可以用 2）古老的DOS 实模式。可以直接用 指针操作 3）Window 及其他现在操作系统      Window 提供了远程内存读写函数，可以操作别的程序的内存 4）另外，几乎所有调试器，都可以读写所加载程序的内存。 也许还有更多 ，例如通过驱动程序，操作别的程序的内存 另外，远程控制系统，可以通过网络连接， 控制另一台计算机进行任何操作，读写内存更不在话下了

user: user-3
content: 楼主需要了解一下进程、虚拟地址空间的概念。

user: user-0
content: 我将程序1中分配的内存指针的地址%p格式输出后，并没有释放内存,getchar();停在了return 0;之前 然后我在程序2中也定义相同类型的指针,scanf("%p",&p);输入后,输出数据，程序停止运行，为什么呢?