class Foo
{
public:
Foo(int i)
{
_i = i;
}
void p()
{
cout<<"printed"<<endl;
}
int _i;
};
int main()
{
Foo *p = 0;
cout <<p<<endl;
p->p();
return 0;
}
上述代码的实际输出是
0
printed
根据我的理解,它应该为访问0x0 addess提供SEG错误。 因为* p地址是0x0。
为什么它有效?有人解释一下吗?
答案 0 :(得分:4)
无效。但 undefined beheviour 并不能保证段错误或其他任何东西。
你不能在这里依赖任何东西,所以不要这样做。它可以(似乎)工作,它可以崩溃,它可以燃烧你的电脑,任何东西。
在这种特殊情况下,方法p()不依赖于其类中的任何其他内容,并且允许编译器假设您的代码中没有UB,因此很可能只执行p而不执行任何操作使用指针(但同样,不能保证编译器正在那样工作)。
答案 1 :(得分:-5)
因为 p()是一种常规方法(即非虚拟),所以可以在编译时解析对 p-&gt; p()的调用,你没有访问 p 的任何成员,方法中不需要有效的 指针。
编辑:..但如上所述,这实际上是未定义的行为。