【问题标题】:Printing the physical address of a C pointer打印 C 指针的物理地址
【发布时间】:2013-10-20 19:33:50
【问题描述】:

我可以使用以下代码打印指针的地址

#include<stdio.
int main(){
    int *q =(int*) malloc(4);
    printf("%x\n",q);
}

当我执行以下代码时,会打印一个十六进制值。它是堆上变量 q 的虚拟地址还是物理地址?如果它是虚拟的,我应该如何打印另一个?

【问题讨论】:

  • 总是虚拟地址,物理地址对你隐藏。
  • @ouah 有没有办法打印物理地址?
  • @SanjeevSharma btw 使用%p 而不是%x 并将地址类型转换为void* 作为printf("%p\n", (void*)q);
  • 应该是int *q = malloc(sizeof *q);。
  • 有些计算机没有虚拟内存——在这种情况下它是物理地址。但是如果操作系统使用虚拟内存,那么它就是一个虚拟地址。如果它是一个虚拟地址,那么只有操作系统知道它的映射位置。这可能有助于解释:youtube.com/watch?v=l7HoguhFVQ4

标签: c memory


【解决方案1】:

这是在虚拟地址空间方面。在标准 C 中获得“物理”地址是不可能的(除非你在一个没有虚拟内存的系统上,当然,在这种情况下它总是物理地址)——如果它当前在交换空间中,例如,除了磁盘上的当前位置之外,它甚至可能没有一个,这对您来说不是很有用。

【讨论】:

    【解决方案2】:

    程序无法知道它是虚拟地址还是物理地址。内存由操作系统和 MMU 处理,MMU 将地址分配给程序。

    【讨论】:

    • 除非没有虚拟地址空间,否则就是虚拟地址。
    猜你喜欢
    • 2012-01-26
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多