std :: cout如何使用null char *指针中止程序?

时间:2017-09-29 03:02:48

标签: c++ c++11

我尝试将nullptr打印到屏幕,并且:

<uses-permission

     android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

我认为编译器(g ++ 4.8.4)可能会警告我不应该尝试cout nullptr。事实是:程序中止了,'/ test已经退出代码0(0x00000000)',就像它正常终端一样。

为什么呢?我的意思是,如果我做错了什么,或者设计的是什么?

感谢

感谢所有人,我知道行为可能是未定义的, 将char *作为字符串,或打印地址。 并建议永远不要这样做。 我只是想知道为什么程序没有告诉我任何东西,比如警告,断言或退出代码如-1,其他任何东西。 它是编译器的设计行为吗?

2 个答案:

答案 0 :(得分:0)

char*是C中的规范字符串实现,不幸的是它们在C ++中也很常见。

由于这个原因,输出char*将不会输出该指针所持有的地址,而是会打印该指针所指向的字符串

实现可能如下所示:

std::ostream& operator<<(std::ostream& os, const char* data)
{
  while (*data)
  {
    os << *data;
    data++;
  }
  return os;
}

因为它取消引用你给它的指针,所以将(char*)nullptr)传递给这个函数会调用未定义的行为,并且在这种情况下中止行为与其他行为一样好。

答案 1 :(得分:0)

在处理ostream时,char*与其他类型的指针不同,因为有一个operator<<专门用于将char*视为空终止C字符串。

您的程序会中止,因为您正在传递operator<< char*指针:

  • 指向您不拥有的记忆,或
  • 指向您拥有的内存,但不是正确的以null结尾的C字符串,或
  • 为NULL

所有这些都会调用未定义的行为,这意味着编译器通过简单地中止您的程序而不是做一些可怕的事情对您非常好。

要打印char*指针的值,请将其转换为void*