2014-10-10 111 views
0

我正在学习C++中的指针。我写了这个简单的程序来展示一下我有一个问题:C++ - 空指针

#include <iostream> 

using namespace std; 

int main() { 
    cout << "test1"; 
    char *ptr = 0; 
    cout << ptr; 
    cout << "test2"; 
} 

当我运行程序时,它不输出“测试2”结尾,而不是只有“测试1”。这应该意味着当我试图打印出ptr的值时它崩溃了?我尝试在Eclipse调试器中逐步完成它,它看起来像每一行被执行,但不会抛出一个错误或什么?

+0

对于初学者来说,试试这个:COUT << “test2的” << ENDL;看看它是否打印出test2。上一行应该打印出ptr的地址。 – 2014-10-10 01:38:41

+0

你说得对 - 对不起,我的坏语义。我不确定它是否是实现定义的。我经常在OSX和Linux上使用GCC。 – 2014-10-10 01:43:45

回答

3
char *ptr = 0; 
cout << ptr; 

还有的<<运营商,需要一个char*操作数,它假定是一个指向C风格字符串的重载。

对于除char*以外的其他指针类型,<<运算符将打印指针(它是一个地址)的值,但将null指针视为指向C样式的字符串会导致未定义的行为。在任何情况下,它都不会打印指针值。

要打印指针值,你可以将其转换为void*

cout << "test1\n"; 
char *ptr = 0; 
cout << static_cast<void*>(ptr) << "\n"; 
cout << "test2" << "\n";; 
+0

我相信static_cast在这里最好。 – 2014-10-10 01:47:16

+0

我可以说至少在C++ 11中,*要求:s不能是空指针。* ergo不检查。 C++ 03是一样的。 – chris 2014-10-10 02:13:15

2

通常你可以输出一个指向cout的指针,它将打印出包含的地址。但是,当您输出char *时,它将被解释为C样式的以null结尾的字符串。在这种情况下,它是一个空指针,并不指向一个字符串。

尝试在输出之前将其转换为void *