【发布时间】:2011-07-12 02:09:34
【问题描述】:
在任何“主要平台”(出于本问题的目的,我将其定义为 Windows、Mac 和 Linux)上,是否可以在程序地址空间中的地址 0 处分配有效分配的指针(因此弄乱了与 NULL 的比较?) 该标准是否甚至允许编译器/平台在地址 0 处进行有效分配?
【问题讨论】:
在任何“主要平台”(出于本问题的目的,我将其定义为 Windows、Mac 和 Linux)上,是否可以在程序地址空间中的地址 0 处分配有效分配的指针(因此弄乱了与 NULL 的比较?) 该标准是否甚至允许编译器/平台在地址 0 处进行有效分配?
【问题讨论】:
C++ 标准允许这样做,但这样的指针不会与文字 0(NULL 指针常量)比较。
然而,主要操作系统中的用户模式应用程序永远不会有一个有效的指针在 0,甚至在 -65536 到 65535 的范围内(以帮助检测来自 NULL 指针的偏移量)。
在大多数情况下,0 作为可用地址只存在于嵌入式系统中,很少出现在 PC 操作系统的内核中。但是虚拟内存系统保留了它,没有任何我听说过的例外。
【讨论】:
NULL-指针(或者更确切地说:需要指针的上下文中的 0 标记)不一定表示地址 0,而是在此平台上已知无效的地址.因此,假设一个兼容的编译器,与空指针的比较是安全的。
【讨论】:
if (some_ptr) 以检查其是否有效?
if(some_ptr) 等同于if(some_ptr != 0),所以我认为这不会成为问题。