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

标签 c++ c pointers system

在“计算机系统:程序员的视角”第 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/

相关文章:

C++ - 使用 >> 运算符读取文件直到到达行尾

c - GNU 链接器和架构 i386

C func 为任意长的行动态分配mem;通过单元测试,原地崩溃

c++ - Qt 中的 QPointer、QSharedPointer 和 QWeakPointer 类有什么区别?

c++ - 除非旋转为 0 度或 180 度,否则物体不会朝它所面对的方向移动

c++ - 动态指针转换

c - 向进程组中除自身以外的所有进程发送信号

c - 程序的合理输出是什么?

c++ - 指针/引用 C++

c++ - 如何在 InitializeObjectAttributes() 中使用 SECURITY_DESCRIPTOR