2

我最近看到一篇文章提到 C/C++ 中的空指针实际上不仅仅是零,而是由编译器解释为平台的任何分配地址为空。

https://stackoverflow.com/a/2760172/2027262

这与我在 Visual Studio 中调试 c++ 时看到的情况有关,其中指针的值是 0xCACACACA (或类似的东西),而它是一个坏指针(但这可能只是为了我们的利益而显示的值)。

长话短说,平台(如 Windows)的真实空指针地址是什么?还是我完全误解了答案?

编辑:

另外,(只是作为扩展)这是做什么的?

int i = 0;

// pretend to do some stuff with i

char* = (char*)i;

编译器会在运行时将指针设置为 null 还是将其设置为零?如果是后者,那是UB吗?它会破坏程序吗?

4

4 回答 4

7

正是出于这个0xCACACACA原因,Visual Studio 生成的通常用于未初始化的指针。当你看到这个时,你就知道有问题了。如果将其初始化为0,则很可能是预期的行为。这仅在调试节点中完成,通过完全优化,未初始化指针的值将只是垃圾。

是的,NULL指针没有0per say 的值。0只是字面意思。实际值可能不同。但是编译器足够聪明,可以将其抽象出来,所以即使你有一个 NULL 指针,它的值不是真正的 0(如数字 0),将它与0or进行比较NULL仍然会产生 true。最好从nullptr真正的角度考虑。

于 2013-05-30T06:00:38.277 回答
4

这个问题以前出现在 comp.lang.c 新闻组上。您可以使用 Google Groups 阅读存档

在该线程中,Paul Sand 引用了另一个来源,H. Rabinowitz 和 Chaim Schaap 的“Portable C”,如下:

某些 Prime 计算机使用不同于 all-bits-0 的值来编码空指针。此外,一些大型 Honeywell-Bull 机器使用位模式 06000 来编码空指针。在这样的机器上,对指针的赋值会0产生指定空指针的特殊位模式。

同样,(char *)0产生指定空指针的特殊位模式。

您通常会在使用物理内存地址时看到非空指针(即,当没有 MMU 或处于绕过 MMU 的内核模式时)并且机器在 address 或附近有内存映射 I/O 0。您希望空指针在无人区中脱颖而出,因此如果您偏移它(例如通过指针访问结构成员),您将不会获得任何有用的地址。

对于您的具体问题,只有带有值的整数常量表达式0被解释为空指针。所以

char* p = (char*)i;

不能移植p生成一个空指针(即标准不做这样的保证,但您的特定编译器可以)。

于 2013-05-30T06:15:41.793 回答
0

NULL 字符的原始含义类似于 NOP——当发送到打印机或终端时,它什么也不做(但是,有些终端错误地将其显示为空格)

在 C、C++ 中很好;空指针常量是计算结果为零的整数常量表达式(例如 0 或 0L),或者是 nullptr_t 类型的值(例如 nullptr)。

空指针常量可以转换为任何指针类型(或指向成员的类型),它获取空指针值。这是一个特殊值,表示指针未指向任何对象。

请参阅此 http://bytes.com/topic/c/answers/213647-null-c

于 2013-05-30T06:06:39.660 回答
0

空指针具有一个保留值,用于指示该指针未引用有效对象。空指针通常用于表示条件,例如未知长度列表的结尾或未能执行某些操作;可以将这种空指针的使用与可以为空的类型和选项类型中的 Nothing 值进行比较。

我希望这会让你明白,但更多信息请访问这个

于 2013-05-30T06:00:31.570 回答