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

标签 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 地址提供 SEG 错误。 因为*p地址是0x0。

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

最佳答案

这是无效的。但是undefined beheviour 不保证段错误或任何东西。

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

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

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

相关文章:

c++ - 错误 : cast from 'const prog_uchar*' to 'byte' loses precision?

c++ - 程序需要一个括号,但那里已经有一个

c++ - visual studio 继续多行注释

c++ - C++ 的持续集成服务器 - 库依赖项怎么样?

c++ - 数组的指针,那个数组的每个元素的内存空间信息存放在哪里?

c++ - 如何使用 C++ 替换字符串之间的更新值?

c++ - 为什么某些 C/C++ 函数使用指针作为参数?

c++ - 伪造插入器是一种好习惯吗?

c++ - 给定程序中的段错误

c++ - 这些是将 printf 的输出设置为字符串的方法吗?