我正在尝试在c中创建两个.exe文件,其中第一个在内存中存储一些数据并将数据指针保存到.txt。第二个从.txt读取指针并显示它们。
第一个:
fw = fopen("pointer.txt", "w");
fprintf(fw, "%p", &data);
fclose(fw);
第二个:
fr = fopen("pointer.txt", "r");
fscanf(fr, "%p", &pointer);
但是当我运行第二个时,它会显示一个随机数字。
出了什么问题?
答案 0 :(得分:2)
不,你不应该那样做 该地址在第二个exe运行的过程中可能无效。
每个进程都分配一个地址空间,每个exe都在单独的进程中运行。因此分配给这两个进程的地址空间可能完全不同。
通常,操作系统会回收分配给进程的内存,但是它可能无法回收某些资源,如文件句柄等。因此,一旦第一个进程结束,操作系统将回收分配给该变量的内存。
如果您想在两个活动进程中共享内容(两个进程在您需要进行通信时仍处于活动状态),您需要 Interprocess Communication Mechanism(IPC) ,有各种IPC机制,人们通常会根据性能,流程是否相关或是否需要同步等来选择IPC机制。
如果要跨两个非活动进程共享内容(当您需要在它们之间进行通信时,其中一个进程不活动),则将内容存储在文件中是一个很好的选择想法,但你应该存储内容而不是内存地址。
答案 1 :(得分:2)
进程不在实际内存上运行,而是由系统分配给它们的虚拟内存。因此,来自 P1 的0x01111
和来自 P2 的0x01111
不会指向您的RAM的同一扇区。 Ergo,不,你需要使用IPC我想。
答案 2 :(得分:1)
虚拟内存是按进程进行的。请参阅Wikipedia。
答案 3 :(得分:1)
您想要做的是什么,但您的方法不正确 - 每个进程都有自己的虚拟地址空间,因此在一个进程中有意义的地址可能不在另一个进程中,并且无论哪种方式都不会引用同样的记忆。
如果你想在这样的进程之间共享资源,你需要让Windows让你。有关详细信息,请参阅此页:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366878%28v=vs.85%29.aspx。
答案 4 :(得分:1)
您需要使用IPC机制来实现这一目标。看看http://en.wikipedia.org/wiki/Shared_memory#In_software