我使用动态内存分配编写了一个程序。我不使用SaleDate
函数释放内存,仍然在地址处,变量的值存在于那里。
现在我想重用这个值,我希望看到来自另一个进程的RAM中存在的所有变量值。
有可能吗?
free
我希望另一个程序读取a的值,因为它仍然在内存中,因为main函数是无限的。怎么办呢?
答案 0 :(得分:3)
这个问题显示了对至少两个主题的误解。
第一个是虚拟地址空间和内存保护,正如RobertL在他的回答中所述。在现代操作系统上,您无法访问属于另一个进程的内存(即使您知道物理地址,您也不会这样做,因为所有用户空间进程都在地址上工作在他们的私人虚拟地址空间)。尝试访问未映射到地址空间的内容的结果将是分段错误。 Read more on Wikipedia
第二个是C标准的范围。它不了解流程。 C是根据执行程序的抽象机定义的(并且仅此程序)。定义变量的范围和生命周期,相应的最大值是全局范围和静态存储持续时间。所以是的,只要您的程序运行,您的变量将继续存在,但它的范围将是此程序。
当您了解这一点时,您会看到:即使在使用单个全局地址空间且根本没有内存保护的平台上,您也永远无法根据C标准访问其他程序的变量。您可能会以某种方式将指针值传递给您的其他程序并使用它,也许它会起作用,但它会是未定义的行为。
这就是为什么操作系统提供进程间通信的方法,如共享内存(接近你想要的)和管道。
答案 1 :(得分:0)
当您从main()
返回时,该过程会释放所有获取的资源,因此您不能。看看this。
答案 2 :(得分:0)
首先,当您关闭进程时,您分配的内存将完全释放。您可以通过将一个进程写入文件(如.dat文件)而另一个进程从中读取来避免这种情况。还有other ways。
但一般来说,在正常情况下,当您的进程终止时,将释放现有内存。
如果您尝试从进程内的其他进程访问内存,则很可能会出现分段错误,因为大多数操作系统都会保护进程不会互相干扰内存。
答案 3 :(得分:0)
这取决于操作系统。大多数现代多任务操作系统保护进程彼此。硬件设置为禁止进程查看其他进程内存。例如,在Linux和Unix上,为了在内存中的程序之间进行通信,您需要使用操作系统服务进行处理"进程间"通信,例如共享内存,信号量或管道。