【问题标题】:Are NUL and NULL interchangeable in C? [duplicate]NUL 和 NULL 在 C 中可以互换吗? [复制]
【发布时间】:2013-03-06 22:30:16
【问题描述】:

只需阅读 Kenneth Reek 的 C 书上的指针。它说一个 NUL 字节是一个位全为 0 的字节,这样写 '\0' 并且 NULL 的值为 0,它指的是一个值为 0 的指针。

两者都是整数并且具有相同的值,因此它们可以互换使用。

还有这段代码:

char const *keyword[] = { "do", "for", "if", "register", 
                              "return", "switch", "while", NULL };

在这段代码中,NULL 让搜索表的函数检测到表的结尾。那么,我们可以互换 NULL 和 NUL 宏吗?

【问题讨论】:

  • 你试过了吗?您通常使用'\0' 表示字符串中的字符,使用NULLnullptr 表示指针。
  • 所以它们可以互换使用可怕的建议。

标签: c++ c


【解决方案1】:

NUL 是 ASCII 字符代码 0 的表示法。

NULLstddef 中为空指针定义的宏。

所以,,它们不能互换使用。

【讨论】:

  • NULL 具有指针的大小(通常为 32 位甚至 64 位)。 NUL 具有字符大小(在 C 中通常为 8 位,在其他支持 16 位 Unicode 的语言中有时为 16 位)。它们不能互换使用。如果您在字符串中使用 0,则为 NUL。如果在指针中使用 0,则为 NULL。只有 NULL 在 C 中具有宏。在 C 中,所有文字字符串都会在末尾自动附加一个 NUL 0 字节,因此不需要宏。
  • @nonrectangular "NULL 有一个指针的大小" --> 也许。它可能具有int 的大小。 NULL类型 未指定。
【解决方案2】:

没有标准化的 NUL 宏,至少在 C 中没有。

此外,NULL 与普通的 0 文字相比具有优势,它向读者发出信号,“嘿,我们正在处理一个指针”,这可能被认为是一个优势。

在 C++ 中,很长一段时间以来,习惯用法都只是写 0,但后来他们似乎把它颠倒过来并引入了一个新的文字,nullptr,出于某种原因。

在 C 语言中,我建议将 NULL 用于指针,将 '\0' 用于字符。

【讨论】:

  • 更强大的是,避免将NULL 用于字符,因为如果您的代码变成了C++11,能够用nullptr 搜索和替换NULL 可以为您提供额外的类型安全性.并且每次使用NULL 来表示不是指针的整数常量零都会使这变得更加困难。
  • nullptr 的原因是它是一个 void * 指针。 C 中的 NULL 不是。所以“某些原因”是为了类型安全
猜你喜欢
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2012-12-29
  • 2017-12-08
  • 1970-01-01
  • 2012-09-26
相关资源
最近更新 更多