2012-03-01 33 views
-1

值的数目我有关于this问题的答案之一的查询。一个指针可以在32位系统

的回答说:

如果一个32位的处理器可以寻址2^32的存储器位置,即简单地 意味着,在该体系结构C指针可以指2^32 - 1个 位置加NULL

是不是2^32加NULL?为什么是-1?

编辑:对不起,我没有说清楚。编辑的问题。

回答

2

2^32 - 1地点加上NULL

即等于2^32。

在大多数编程语言和操作系统中,NULL是一个专用的指针值(通常为0),表示无效指针,这就是为什么它不能用来指向有效的内存位置。

因为指针就像任何整数一样,所以没有其他方式发出无效指针而不是专用值。因为32位整数可以有2^32个可能的值,所以如果你不计算这个NULL值,你会得到2^32-1有效的存储单元。

0

NULL实际上是一个值,一般为0,所以如果你加它,你得到2^32

1

该文本的作者是有区别的NULL为不是内存位置。因此,您使用2^32可用值中的一个作为NULL,使2^32-1可用于存储器位置。

0

相信NULL的概念最初来自于内存分配时,他们并没有在分配的内存插槽。通过将返回值与NULL进行比较,程序员可以确定指针是否可以被使用。我不相信NULL在讨论中有任何地方,它只是位置0(0x00000000)的别名形式。

在实模式(缺少存储器保护方案)系统中,位置0处的存储器通常可以从中读取并且有时写入(如果它不是只读的)。这当然取决于物理内存芯片是否实际连接到该位置。在许多具有可写0位置的实模式系统中,如果操作该位置,则会得到有趣的结果。在86(16位实模式)PC-DOS系统的位置指向中断向量表的第一载体,通过0点为分中断处理程序程序员可能错误或一些有效的写有一个向量原因。

在保护模式系统中,访问0位置的程序通常会导致内存保护错误,从而终止它。我应该澄清这一点,并说应用程序的位置0几乎肯定不是物理位置0,因为大多数受保护模式的操作系统都使用主机处理器提供的虚拟寻址机制重新映射了应用程序的内存区域。在某些情况下,操作系统本身可能会允许自己或其他程序访问它所喜欢的任何内存位置,但这种情况很少,因此受到限制,应用程序开发人员在其一生中将永远不会遇到它们。

有了这个有点冗长的背景,我同意那些说32位处理器通常有2^32个可寻址位置,范围从0(0x00000000)到2^32-1(0xffffffff)。例外的是早期的32位处理器(例如英特尔的486sx和摩托罗拉的68000),它们实现的处理器数量少于32条。

0

作者说C实现必须保留处理器可以使用的地址之一,以便在C中该地址用于表示空指针。因此,C可以处理比处理器少的存储器位置。约定是将地址0用于空指针。

实际上,32位处理器无论如何都不能真正处理2^32个内存位置,因为地址空间的各个部分将保留用于特殊目的而不是映射到内存。

也没有实际的要求 C实现表示使用处理器使用的相同大小的地址的指针。这样做可能非常低效,但C实现可以使用33位指针(因此需要至少5个字节的存储空间,并且不适合CPU寄存器),从而使其可以使用空值指针不是处理器可以处理的2^32地址之一。

不过,假设没有这样的,这是事实,一个32位指针可以表示任何的2^32个地址(这些地址是否指向存储器位置是另一回事),并且这也是事实,由于C需要一个空指针,其中一个地址必须用来表示“空指针”。

相关问题