这是一个简单的例子。
void func()
{
int* p = nullptr;
if(p == nullptr)
{
int n;
p = &n;
}
*p = 10; // undefined behavior??
}
int main()
{
func();
}
Run Code Online (Sandbox Code Playgroud)
没有complie警告(visual studio 2019),以这种方式使用“* p = 10”是“未定义的行为”吗?
它会因编译器、调试或发布而异吗?
是的,取消引用的行为p是未定义的。
还要注意,一旦它指向的对象超出范围,即使读取 的行为p也是有问题的:此时它是一个无效的指针值,并且正式的读取行为p是实现定义的,它可以包括系统生成的运行时过错。
后一点经常被忽视。