当前位置: 首页 > 知识库问答 >
问题:

如何Foo * p = 0;p->p()有效?[重复]

贺子昂
2023-03-14
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。

为什么它会起作用?有人解释一下吗?

共有2个答案

吕奇
2023-03-14

因为p()是一个普通的方法(即不是虚的),所以对p-的调用

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

万俟飞语
2023-03-14

它是无效的。但是,未定义的beheviour并不能保证segfaults或任何东西。

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

在这种特殊的情况下,方法p()不依赖于它的类中的任何其他东西,编译器被允许假设你的代码中没有UB,所以它很可能只是执行p,甚至没有对指针做任何事情(但是同样,不能保证编译器是这样工作的)。

 类似资料:
  • 描述 (Description) 字符类[\p{L}&&[^\p{Lu}]]匹配除大写字母之外的任何字符。 例子 (Example) 以下示例显示了Unicode字符类匹配的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class UnicodeCh

  • p

    P is for peer-to-peer networking with browsers P is a small framework used to create browser-to-browser networks (as opposed to just a connection). With P, you can: Connect to other browsers using a s

  • P*

    P* (P-star)是一种网站编程语言,其中包括了常用的任务像模板处理以及数据查询。它突出的特性有用预处理语句来访问MySQL数据库;HTML模板;标准的计数,变量,函数和结构;JSON输出,GET和POST。

  • 本文向大家介绍C中的++ * p,* p ++和* ++ p之间的区别,包括了C中的++ * p,* p ++和* ++ p之间的区别的使用技巧和注意事项,需要的朋友参考一下 指针式 在C语言中,* p表示存储在指针中的值。++是前缀和后缀表达式中使用的增量运算符。*是取消引用运算符。前缀++和*的优先级相同,并且两者从右到左关联。后缀++的优先级高于前缀++和*,并且从左到右具有关联性。请参见以

  • 外部访问容器 有时候,容器要运行一些网络应用,需要外部能访问到这些应用,就需要使用-p/P 参数指定一个主机端口,映射到容器端口中。其中使用P系统会分配一个随机的端口到内部容器开放的网络端口。 就拿仓库服务镜像来做例子: $ sudo docker run -d -P registry b89fc89e061dee24ac532af1890cd26e6e016545e0978b01d3d4eadc

  • 本文向大家介绍C语言中指针 int *p=0;和int *p;*p=0;和”&“的关系和区别详解,包括了C语言中指针 int *p=0;和int *p;*p=0;和”&“的关系和区别详解的使用技巧和注意事项,需要的朋友参考一下 初学者在学习C语言的时候,最头疼的可能就是指针,话不多说。让我们直接进入正题 直接上代码 直接运行,好了,程序是不是报错了?那就对了。因为此时的int *p=0实际等于in