如何Foo * p = 0; p-> p()是有效的?

时间:2017-03-15 10:48:52

标签: c++

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。

为什么它有效?有人解释一下吗?

2 个答案:

答案 0 :(得分:4)

无效。但 undefined beheviour 并不能保证段错误或其他任何东西。

你不能在这里依赖任何东西,所以不要这样做。它可以(似乎)工作,它可以崩溃,它可以燃烧你的电脑,任何东西。

在这种特殊情况下,方法p()不依赖于其类中的任何其他内容,并且允许编译器假设您的代码中没有UB,因此很可能只执行p而不执行任何操作使用指针(但同样,不能保证编译器正在那样工作)。

答案 1 :(得分:-5)

因为 p()是一种常规方法(即非虚拟),所以可以在编译时解析对 p-&gt; p()的调用,你没有访问 p 的任何成员,方法中不需要有效的 指针。

编辑:..但如上所述,这实际上是未定义的行为。