【问题标题】:Can address of pointers in two programs be equal? [closed]两个程序中的指针地址可以相等吗? [关闭]
【发布时间】:2014-01-10 01:54:49
【问题描述】:

当两个程序同时运行时,你打印指针指向的地址,是否会发生两个程序打印相同的值?

【问题讨论】:

  • “同时运行”比听起来要深刻得多。
  • 不同运行程序中的指针不能相等,因为无法对它们应用==相等运算符。
  • @KeithThompson:可以想象一个进程打印与%p 一个指针和另一个读取它......所以你可以想象一种人为的方式来比较它们(即使它是荒谬的)。跨度>
  • 我对这个问题的高分感到有点惊讶。我不觉得“这个问题显示了很多研究工作,并且有用且清晰”......
  • 是的,很常见,尤其是当两个指针都是NULL时。

标签: c pointers


【解决方案1】:

是的。该程序在操作系统分配的虚拟内存中运行。虚拟内存量由处理器架构决定。

您看到的地址是指虚拟内存地址,而不是物理 RAM 地址。

我要补充一点,在系统上运行的每个进程都会获得一个巨大的地址空间(在 32 位操作系统上为 2^32,在 64 位操作系统上为 2^64)位操作系统)分配给它。进程就在这个虚拟地址空间上运行。

【讨论】:

    【解决方案2】:

    在 Linux 等操作系统上,正在运行的程序称为process。每个进程都有自己的address space 并使用virtual memory。所以同一个地址0x12345通常指的是进程A和进程B中不同的内存单元。

    阅读Advanced Linux Programming,其中有一些章节解释了这一点(从 Linux 的角度来看)。另请参阅 fork system call,并阅读 fork(2)mmap(2)execve(2) 手册页。

    其他操作系统(Windows、MacOSX)也有进程使用虚拟内存在自己的地址空间中运行。

    细节可能相当复杂(实际上,一些 RAM 可以在进程之间共享......)。了解copy on writeshared memory 等...

    还可以阅读一些关于Operating Systems 的好书,例如Tanenbaum's book,或Operating Systems : Three Easy Pieces(可在线免费下载)。

    【讨论】:

    • 高级 Linux 编程+1。
    【解决方案3】:

    您的问题标题与正文不太匹配。题目问:

    两个程序中的指针地址可以相等吗?

    是的,这是可能的,正如其他人已经指出的那样,存在虚拟内存和各种其他诡计。

    此外,NULL 指针常量在程序的每个实例中通常总是相同的(老实说,我不知道在哪个平台上它会因运行而异)。因此,如果在这两个程序中,您都打印NULL,甚至预计结果将是相同的。


    现在在问题中,您要问的是打印这些指针,这是完全不同的事情:

    当两个程序同时运行时,你打印指针指向的地址,会不会发生两个程序打印相同的值?

    由于这个标签是c,所以我从C的角度来回答:

    是的。假设您的意思是printf("%p", (void *)thePointer),这是完全可能的。 %p 转换说明符以实现定义的方式格式化指针。此外,如果您在完成正确的类型转换后将其打印为整数,那么转换的结果也是实现定义的。因此,每次您尝试打印指针时,您的程序可能总是打印0xfffffffffoobarwhy are you even curious of internals like a pointer's value。所以是的,这两个程序可能有相同的输出。

    【讨论】:

    • 现在我想制作一个兼容 posix 的操作系统,当你尝试格式化指针时它会打印出来。
    • @KarlDamgaardAsmussen 同意!我会喜欢的! :D
    【解决方案4】:

    C 语言没有指定两个不同进程之间的交互。不能保证两个不同程序中的指针彼此之间会有任何有意义的联系。

    如果您指定操作系统、C 编译器以及程序的执行方式,可能会提供对您有所帮助的答案。

    但这不是 C 语言试图控制的,完全取决于操作系统和运行程序的硬件。

    【讨论】:

    • +1 提到 C 没有对此做出任何说明。
    【解决方案5】:

    是的,它可能会发生。该程序在虚拟内存上运行。如果一个进程开始执行,则会为每个进程创建一个process address space。不仅是2个进程,多个进程在打印时可以有相同的地址。

    https://stackoverflow.com/a/18479996/1814023 会给你一个进程地址空间的样子......每个进程都有一个由操作系统分配的类似副本。

    【讨论】:

      【解决方案6】:

      如果你想这样做,你可以在两个进程之间使用share memory

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-11
        • 2011-03-19
        • 2021-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多