This question already has answers here:
What will happen when I call a member function on a NULL object pointer?
                                
                                    (6个答案)
                                
                        
                                2年前关闭。
            
                    
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


根据我的理解,它应该给SEG错误提供访问0x0 addess的权限。
因为* p地址是0x0。

为什么起作用?有人解释吗?

最佳答案

这是无效的。但是不确定的行为不能保证段错误或其他任何东西。

您在这里不能依靠任何东西,所以不要这样做。它可以(似乎)正常工作,崩溃,可以烧毁计算机或其他任何东西。

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

关于c++ - Foo * p = 0; p-> p()如何有效? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42807560/

10-09 15:46