char * p = NULL,cout<

时间:2015-03-02 05:29:03

标签: c++ pointers char

我最近在接受采访时被问到这个问题:

char* p = NULL;
cout << p << endl;
++p;
cout << p << endl;

我给出的答案是,第一个cout将打印00000,接下来将打印00001。 但是当我在visual studio中检查它时,它给出了一个例外: StringFunctions.exe中0x009159F1处的第一次机会异常:0xC0000005:访问冲突读取位置0x00000000。 StringFunctions.exe中0x009159F1处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。

但它对int,float等的预期效果如预期 有人可以解释一下吗? 感谢帮助!

3 个答案:

答案 0 :(得分:3)

char*的{​​{1}}重载需要以空字符结尾的C字符串。这就是为什么它试图访问指针。

要绕过此行为,请先将指针强制转换为std::cout::operator<<

答案 1 :(得分:2)

输出流知道,当您传递char*时,您想要打印字符串。你传递了一个未初始化的指针。它试图将其作为C字符串读取......而且,它调用了未定义的行为。

如果您想首先打印转换为void*的地址,即static_cast<void*>(p)

另外,NULL无法保证评估为0(在所有0位意义上)。但是,保证将同等0进行比较。不一样的事情。此外,您的增量也会调用UB。

答案 2 :(得分:0)

当然,在最简单的解释中,cout尝试依赖指针并打印字符串,因为你传递了一个char指针

理解这一点的最好方法是遵循一段代码。

char *s = "hello";
cout << s+2 << endl; // Or &s[2]

它会输出“llo”,因为第一次预感会像“第一个l的打印地址”