Pointers 指针指向什么类型的内存地址?

Pointers 指针指向什么类型的内存地址?,pointers,memory,memory-management,Pointers,Memory,Memory Management,我们知道C中的指针用来存储任何东西的内存地址,但这是什么内存?我的意思是它是RAM还是硬盘? 对于变量,我可以断定它必须是RAM,因为变量只有在程序运行时才存在。但是函数呢?如果我做了一个指向函数的指针,那么它必须指向硬盘中函数的地址,因为即使程序没有运行,函数也存在。如果是这样,那么我们如何通过查看内存地址来知道它是对应于RAM还是硬盘 而且,例如,如果我有一个在硬盘中占用10MB的程序,当我运行该程序时,首先将该程序加载到RAM中。程序是否也占用10MB内存?如果不是,那么什么因素决定程序在

我们知道C中的指针用来存储任何东西的内存地址,但这是什么内存?我的意思是它是RAM还是硬盘? 对于变量,我可以断定它必须是RAM,因为变量只有在程序运行时才存在。但是函数呢?如果我做了一个指向函数的指针,那么它必须指向硬盘中函数的地址,因为即使程序没有运行,函数也存在。如果是这样,那么我们如何通过查看内存地址来知道它是对应于RAM还是硬盘


而且,例如,如果我有一个在硬盘中占用10MB的程序,当我运行该程序时,首先将该程序加载到RAM中。程序是否也占用10MB内存?如果不是,那么什么因素决定程序在RAM中占用的内存?

指针指向某个内存,正确,同意。它指向的内存取决于使用情况/环境

为了详细说明,通常对于用户空间程序,指针指向程序中的某个地址

另一方面,对于低级系统编程(例如,在内核中)和没有MMU的OSs,它指向物理内存

我的意思是它是RAM还是硬盘

要么都有,要么都没有。这要看情况而定。通常,在程序执行开始时,为每个进程分配一个虚拟地址空间。MMU/OS的任务是确保所需的“实际”内存“根据请求”可用。此外,这还包括分页概念

抄袭

它表明,

  • 进程“app1”的虚拟地址空间
  • 进程“app2”的虚拟地址空间
  • 内核进程的虚拟地址空间
  • 用户空间库的虚拟地址空间
  • 页文件的虚拟地址空间映射,用于访问虚拟内存

    • 指针指向进程的虚拟地址空间。地址可以由RAM、磁盘或两者都支持

      例如:

    • 您可以使用
      malloc
      分配一些内存。在这一点上,它可能没有任何支持

    • 你给那记忆写信。现在它可能是由RAM支持的

    • 您可以将内存映射到一个文件。此时它由文件支持

    • 你是从记忆中读出来的。现在它由文件和RAM支持

    • 操作系统希望为磁盘缓存提供更多的RAM,而您已经有一段时间没有访问该内存了,因此它会删除您读取的页面,现在您的内存映射再次仅由文件支持

    • 操作系统窃取了支持您使用
      malloc
      分配并写入的内存的页面,现在内存只支持分页文件

    • 而且,例如,如果我有一个在硬盘中占用10MB的程序,当我运行该程序时,首先将该程序加载到RAM中

      在您可能会使用的大多数现代操作系统上都不是这样。相反,10MB的虚拟地址空间由可执行文件分配和支持。页面在被访问时将被读入RAM(并且RAM的页面将被分配)

      程序是否也占用10MB内存

      还没有。但是在访问页面时需要RAM

      如果不是,那么什么因素决定程序在RAM中占用的内存


      这是操作系统必须根据为系统整体提供最佳性能而做出的决定。您可以将RAM视为一个缓存,随着RAM可用以及数据被访问或未被访问,操作系统会将东西移入和移出RAM。

      是否有帮助?“首先,程序加载到RAM”在大多数现代操作系统上都没有。这与语言标记无关,请删除它们。指针始终指向内存中的某个位置(RAM)。唯一的区别是它们可能位于堆栈(函数调用堆栈的工作内存)或堆(为整个程序分配的内存)上。我假设函数指针实际上是通过堆处理的,因为在分配的堆内存之外调用指针会导致操作系统级别的分段错误。@JasonLang胡说八道。指针总是指向虚拟内存中的某个地方。它们可能指向RAM,也可能不指向RAM。(我可以在内存为4GB的系统上映射一个12GB的文件,然后形成指向该文件每个字节的指针。你不能告诉我这些指针必须指向RAM——机器上没有12GB的RAM。)
                 0                                            4GB
      VAS 1      |---vvvv-------vvvvvv---vvvv----vv---v----vvv--|
      mapping        ||||       ||||||   ||||    ||   |    |||
      file bytes     app1 app2  kernel   user   system_page_file
      mapping             ||||  ||||||   ||||       ||   |
      VAS 2      |--------vvvv--vvvvvv---vvvv-------vv---v------|