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。
为什么它能工作?有人能解释一下吗?
发布于 2017-03-15 18:51:30
它无效。但是未定义的行为并不能保证段错误或任何东西。
在这里你不能依赖任何东西,所以不要这么做。它可以(看起来)工作,它可以崩溃,它可以烧毁你的电脑,任何东西。
在这种特殊情况下,方法p()不依赖于其类中的任何其他内容,并且允许编译器假定您的代码中没有UB,因此它很可能只执行p而不对指针做任何操作(但同样,不能保证编译器是这样工作的)。
发布于 2017-03-15 18:55:31
因为p()是一个普通的方法(即非虚的),所以p->p()的调用可以在编译时解析,而且因为你不需要访问p a的任何成员,所以这个指针在方法中是不需要的。
编辑:..但如上所述,这实际上是未定义的行为。
https://stackoverflow.com/questions/42807560
复制相似问题