【发布时间】:2016-08-21 11:37:13
【问题描述】:
#include <iostream>
int main()
{
int *ptr = NULL;
// It does not crash
*ptr; --------> Point-1
//But this statment crashed
std::cout<<"Null:"<<*ptr<<"\n"; ------> Point-2
return 0;
}
在上面的代码中,当我评论“Point-2”时,代码没有崩溃。 但是当我取消注释“Point-2”时,它就崩溃了。 由于 ptr 理想情况下为 NULL,因此 Point-1 也应该崩溃。如果我错了,请纠正我。 有人能解释一下为什么当我简单地取消引用指针时代码没有崩溃吗?
【问题讨论】:
-
在没有优化的调试模式下编译,然后重试..
-
停止假设调用未定义的行为会导致已定义的行为。它没有。事实是,如果你幸运,它就会崩溃,而你真的很想看看它以了解为什么会这样。
-
我们需要一个规范的问题“为什么调用未定义行为的代码的行为方式让我感到惊讶?”回答“因为它可以。”
-
@WhozCraig 在这种情况下编译器可以抛出一个没有副作用的未使用表达式的原因是因为取消引用 NULL 是 UB。否则,该表达式可能会产生副作用。 (这也是取消引用 NULL 是 UB 的原因。我们希望这种优化成为可能。)