【问题标题】:Can a valid pointer be allocated at address 0?可以在地址 0 分配一个有效的指针吗?
【发布时间】:2011-07-12 02:09:34
【问题描述】:

在任何“主要平台”(出于本问题的目的,我将其定义为 Windows、Mac 和 Linux)上,是否可以在程序地址空间中的地址 0 处分配有效分配的指针(因此弄乱了与 NULL 的比较?) 该标准是否甚至允许编译器/平台在地址 0 处进行有效分配?

【问题讨论】:

    标签: c++ pointers null std


    【解决方案1】:

    C++ 标准允许这样做,但这样的指针不会与文字 0(NULL 指针常量)比较。

    然而,主要操作系统中的用户模式应用程序永远不会有一个有效的指针在 0,甚至在 -65536 到 65535 的范围内(以帮助检测来自 NULL 指针的偏移量)。

    在大多数情况下,0 作为可用地址只存在于嵌入式系统中,很少出现在 PC 操作系统的内核中。但是虚拟内存系统保留了它,没有任何我听说过的例外。

    【讨论】:

    • NULL 指针访问是一个大问题,以至于一些小型嵌入式微控制器保留内存空间 0 用于检测 NULL 指针访问,并在访问时发出硬件中断。我工作的一个硬件模拟器上有一个 LED,当访问地址 0 时该 LED 亮起。
    【解决方案2】:

    NULL-指针(或者更确切地说:需要指针的上下文中的 0 标记)不一定表示地址 0,而是在此平台上已知无效的地址.因此,假设一个兼容的编译器,与空指针的比较是安全的。

    【讨论】:

    • 不会在不同平台上替换 NULL 的值会导致指向布尔类型转换的指针出现问题,例如初始化指向 NULL 的指针然后执行if (some_ptr) 以检查其是否有效?
    • if(some_ptr) 等同于if(some_ptr != 0),所以我认为这不会成为问题。
    • @hex: 不,因为 C++ 指定从指针到布尔值的转换当且仅当指针为空时为假。
    • 指向成员的指针通常使用非 0 值作为 null。
    • @mattnz:一个傻瓜,或者一个知道如何编写半体面的 C 的人,因此甚至没有注意到空指针不是表示为所有位 0。
    猜你喜欢
    • 2013-12-04
    • 2016-08-11
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2011-03-19
    • 2022-11-22
    相关资源
    最近更新 更多