首页 文章

char * p = NULL,cout << p;给出例外

提问于
浏览
0

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

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 回答

  • 2

    std::cout::operator<<char* 重载需要以空值终止的C字符串 . 那个's why it'试图访问指针 .

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

  • 3

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

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

    顺便说一句, NULL 不能保证评估为 0 (在所有 0 位意义上) . 但是,保证与 0 平等比较 . 不一样的事情 . 此外,您的增量也会调用UB .

  • 0

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

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

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

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

相关问题