2009-08-24 89 views

回答

11

你问一般指针吗?

在大多数操作系统上,它们都是逻辑地址。

操作系统负责通过虚拟内存和分页机制将它们转换为物理地址。这对程序是透明的。这就是为什么一个误导性的节目“碰到边界”和GPF。

在一些旧系统(例如DOS)上,它们将是物理的,允许您覆盖内存其他部分的内容。

7

取决于操作系统和代码运行的级别。

对于现代操作系统上的普通用户程序,您将获得虚拟地址。

+1

但如果我运行以下程序:int main(){int(* p)(); p = main; printf(“%p”,p);} 它给的地址如0x80483c4,它认为它是物理地址,为什么主要的虚拟地址会在这么大的地址启动? 我在linux.plz上运行这个澄清如果我错了?? – mawia 2009-08-24 18:35:21

+4

你错了。这是一个虚拟地址。没有人说你的main()函数是在虚拟地址0加载的。实际上,在ELF二进制文件(在linux中使用)中默认情况下,代码段从虚拟地址0x80482c0开始,这看起来是正确的(有一些隐藏的设置main()之前的代码)。请记住,虚拟地址空间通常是非连续的,虚拟地址只在您使用时分配。仅仅因为你的程序在0x80482c0加载并不意味着在那里和0x0之间的所有内容都已经被分配了。 – 2009-08-24 18:41:41

+0

如果你真的有兴趣了解你的程序在Linux下如何在内存中组织,请阅读以下内容:http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html – 2009-08-24 18:42:17