【发布时间】:2014-02-17 03:34:35
【问题描述】:
在“计算机系统:程序员的视角”第 2.1 节(第 31 页)中,它说:
C 中指针的值是某个存储块的第一个字节的虚拟地址。
在我看来,C 指针的值可以取 0 到 [虚拟内存大小 - 1] 之间的值。是这样吗?如果是,我想知道是否有任何机制可以检查程序中的所有指针是否都分配了合法值——值至少为 0,最多为 [虚拟内存大小 - 1],以及这种机制的内置位置——在编译器中?操作系统?还是其他地方?
【问题讨论】:
-
我认为是通过指针的大小来确定的,在32位系统中,指针的大小是4bytes,虚拟内存是2^32,所以它总是有效的?
-
合法值是实现和操作系统特定的。为了完成你所寻求的需要一个系统,它确实知道每个指针在你的运行代码中的位置。大多数分析器寻找是有效的指针因为字节序列是一个有效的内存偏移),但有非常几个平台(我只能想一想)实际知道存储在进程内存中特定位置的值是否是(a)指针,并且(b)持有有效地址。
-
指针可以取任何有效值。但是“有效”在很多方面都有限定。零是有效的,但 1 肯定不是。一些范围是有效的,而另一些则不是,这取决于分配给进程的地址范围。偶数地址可能有效,奇数无效,具体取决于架构细节。
-
@WhozCraig - Java 的某些版本知道哪些特定位置是指针,哪些不是,但在 C 中几乎不可能。
-
@HotLicks 如果在内核级别完成,这很困难,但并非不可能。一个 AS/400 可以做到这一点(我能想到的一个平台),说它是非凡的将是对史诗比例的轻描淡写。