【问题标题】:C++ What are the NULL pointer values?C++ NULL 指针值是什么?
【发布时间】:2013-05-30 05:54:53
【问题描述】:

我最近看到一篇文章提到,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吗?它会破坏程序吗?

【问题讨论】:

  • 您在寻找什么样的答案?一份清单?
  • 您可以阅读:c-faq.com/null/machnon0.html
  • 您说 NULL 实际上取决于实现是正确的。检查 C++ 的 和 C 的 。但在 c/c++ 模型中,您可以认为 NULL 为 0。
  • @Niko 不是完整列表,而是一些参考资料。

标签: c++ c null


【解决方案1】:

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

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

【讨论】:

  • 然而,我从未听说过任何架构,其中 NULL 指针的值不包含所有 0 位。
  • 如果你输入强制类型转换和值为 0 的整数到一个指针并赋值呢?到那时它已经超出了编译器的控制范围,会发生什么?
  • @MrUniverse 它是一个值为 0 的指针 - 不一定是空指针,但在大多数平台上可能是空指针。
  • 那么它是 UB 还是具有非零空指针的平台会“与它一起”。
  • @MrUniverse 你根本不应该这样做。它可以工作,也可以不工作。不要随机分配指针。4
【解决方案2】:

这个问题以前出现在 comp.lang.c 新闻组上。你可以read the archive with Google Groups

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

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

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

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

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

char* p = (char*)i;

不会可移植地使p 成为空指针(即标准不提供此类保证,但您的特定编译器可以)。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 物理上它们是不应该使用的垃圾值。
    【解决方案4】:

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

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

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

    参考这个 http://bytes.com/topic/c/answers/213647-null-c

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 2020-04-22
      • 2015-01-02
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      相关资源
      最近更新 更多