首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Foo *p = 0;p->p()如何有效?

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

Stack Overflow用户
提问于 2017-03-15 18:48:52
回答 2查看 147关注 0票数 1
代码语言:javascript
复制
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;
}

上述代码的实际输出为

代码语言:javascript
复制
0
printed

根据我的理解,访问0x0地址时应该给出SEG错误。因为*p地址是0x0。

为什么它能工作?有人能解释一下吗?

EN

回答 2

Stack Overflow用户

发布于 2017-03-15 18:51:30

它无效。但是未定义的行为并不能保证段错误或任何东西。

在这里你不能依赖任何东西,所以不要这么做。它可以(看起来)工作,它可以崩溃,它可以烧毁你的电脑,任何东西。

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

票数 4
EN

Stack Overflow用户

发布于 2017-03-15 18:55:31

因为p()是一个普通的方法(即非虚的),所以p->p()的调用可以在编译时解析,而且因为你不需要访问p a的任何成员,所以这个指针在方法中是不需要的。

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

票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42807560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档