【问题标题】:printing nullptr with std::cout and printf [duplicate]使用 std::cout 和 printf 打印 nullptr [重复]
【发布时间】:2020-06-12 06:25:47
【问题描述】:

我想知道“cout”nullptr 不起作用。 它只工作一次。 但是“printf”在主要功能上起作用。

#include <iostream>
int main() {
  const char *np=nullptr;

  std::cout << "np: "<<np<<std::endl;
  std::cout << "np: "<<np<<std::endl;
  std::cout << "np: "<<np<<std::endl;
  printf("printf np:%s\n",np);
  std::cout << "np: "<<np<<std::endl;
  std::cout << "np: "<<np<<std::endl;
}

它的工作原理如下。

np: printf np:(null)

【问题讨论】:

  • @TonyTannous 可能不会。 Op 不尝试打印 nullptr 关键字,而是打印 is 为空的 const char*
  • 这不是打印空指针,而是打印指针指向的内容。如果指针无效,我们有 UB。

标签: c++


【解决方案1】:

这是未定义的行为

在这两种情况下,您都在打印 C 风格的字符串(const char *)。所以实现需要找到这个字符串的长度并在其中搜索终止的空字符。但是指针是无效的,所以你会得到未定义的行为。

技术上两种情况都是 UB,但您正在使用的 printf 的实现似乎正在识别无效指针并打印 (null),而 std::cout 只是崩溃。

(或者它也可能识别出无效指针并优雅地设置失败位,从而忽略进一步的操作。但最终它是UB,所以任何事情都可能发生在这里。)

【讨论】:

  • 非常感谢!!这对我真的很有帮助
【解决方案2】:

nullptrstd::nullptr_t 的一种类型,它没有为std::cout 定义任何操作符,以便能够打印该类型的对象。

一种可能的打印方式,虽然它会打印零:

#include <iostream>

int main(void) {
    const char *np = nullptr;

    std::cout << static_cast<const void*>(np) << std::endl;

    return 0;
}

只需将其转换为 const void 指针。然后你会得到类似的东西:

0

但不是(null),这是上面解释的。

【讨论】:

  • 我明白了!谢谢罗汉!
猜你喜欢
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 2013-01-29
相关资源
最近更新 更多