首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >char* p=NULL,cout<<p;提供异常

char* p=NULL,cout<<p;提供异常
EN

Stack Overflow用户
提问于 2015-03-02 05:29:03
回答 3查看 478关注 0票数 1

我最近在一次采访中被问到这个问题:

代码语言:javascript
运行
复制
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等,它的工作效果与预期一样。有人能解释一下吗?感谢你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-02 05:39:14

char*重载的std::cout::operator<<需要一个以空结尾的C-字符串。这就是它试图访问指针的原因。

若要绕过此行为,请先将指针转换为void*

票数 4
EN

Stack Overflow用户

发布于 2015-03-02 05:35:02

输出流知道,当您传递一个char*时,您希望打印一个字符串。您传递了一个未初始化的指针。它试着把它读成C字串..。而且,嗯,这引发了未定义的行为。

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

顺便说一句,NULL不能保证计算为0 (在所有0位意义上)。然而,它保证与0相当。不是一回事。而且,您的增量也会调用UB。

票数 2
EN

Stack Overflow用户

发布于 2015-03-02 05:31:47

当然,最简单的解释是,cout试图尊重指针并打印字符串,因为您传递了一个char指针。

理解这一点的最好方法是下面的代码。

代码语言:javascript
运行
复制
char *s = "hello";
cout << s+2 << endl; // Or &s[2]

它将输出"llo“,当第一个预感是类似于”第一个l的打印地址“时。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28803205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档