gpt4 book ai didi

c++ - c指针可以取的值范围?

转载 作者:太空宇宙 更新时间:2023-11-04 01:31:31 25 4
gpt4 key购买 nike

在“计算机系统:程序员的视角”,第 2.1 节(第 31 页)中,它说:

The value of a pointer in C is the virtual address of the first byte of some block of storage.

对我来说,C 指针的值听起来可以取从 0 到 [虚拟内存大小 - 1] 的值。是这样吗?如果是,我想知道是否有任何机制可以检查程序中的所有指针是否都分配了合法值——值至少为 0,最多 [虚拟内存大小 - 1],以及这种机制的内置位置——在编译器?操作系统?还是其他地方?

最佳答案

没有检查指针有效性的过程,因为使用无效指针无论如何都会产生未定义的影响。

通常,指针不可能保存可寻址范围之外的值,因为两者具有相同的可用范围——例如两者都是 32 位的。然而,一些 CPU 有关于指针对齐的规则,这可能会使某些地址对某些类型的数据无效。一些运行时,例如 64 位 Objective-C,它是 C 的严格超集,使用不正确对齐的指针将文字对象伪装成堆上的对象。

还有一些情况,完整的地址空间由指令集定义为一回事,但由特定硬件实现为另一回事。历史上的一个例子是最初的 68000,它定义了 32 位空间,但只有 24 条地址线。非常早期的 Mac OS 版本使用备用的 8 位作为描述数据 block 的标志,依赖于硬件来忽略它们。

所以:

  • 没有运行时有效性检查;
  • 即使有,有效性的含义通常取决于特定的 CPU 型号(而不仅仅是系列)或操作系统的特定版本(同上),以便使检查任务比您想象的更简单。

在实践中,如果您的地址对于该硬件来说是非法的,但被访问为合法是处理器异常,通常会发生什么。

关于c++ - c指针可以取的值范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21820249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com