我最近在一次采访中被问到这个问题:
char* p = NULL;
cout << p << endl;
++p;
cout << p << endl;我给出的答案是,第一个cout将打印00000,接下来将打印00001。但是当我在visual studio中检查它时,它提供了一个异常:在StringFunctions.exe: 0xC0000005:访问违规读取位置0x00000000中,0x009159F1出现了第一次异常。在StringFunctions.exe中0x009159F1处未处理的异常: 0xC0000005:访问冲突读取位置0x00000000。
但对于int、float等,它的工作效果与预期一样。有人能解释一下吗?感谢你的帮助!
发布于 2015-03-02 05:39:14
char*重载的std::cout::operator<<需要一个以空结尾的C-字符串。这就是它试图访问指针的原因。
若要绕过此行为,请先将指针转换为void*。
发布于 2015-03-02 05:35:02
输出流知道,当您传递一个char*时,您希望打印一个字符串。您传递了一个未初始化的指针。它试着把它读成C字串..。而且,嗯,这引发了未定义的行为。
如果您想先打印到void*的地址,即static_cast<void*>(p)。
顺便说一句,NULL不能保证计算为0 (在所有0位意义上)。然而,它保证与0相当。不是一回事。而且,您的增量也会调用UB。
发布于 2015-03-02 05:31:47
当然,最简单的解释是,cout试图尊重指针并打印字符串,因为您传递了一个char指针。
理解这一点的最好方法是下面的代码。
char *s = "hello";
cout << s+2 << endl; // Or &s[2]它将输出"llo“,当第一个预感是类似于”第一个l的打印地址“时。
https://stackoverflow.com/questions/28803205
复制相似问题