首页 >后端开发 >C++ >为什么在 C 中通过空指针调用方法有时会起作用?

为什么在 C 中通过空指针调用方法有时会起作用?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-01 02:27:271003浏览

Why Does Invoking a Method Through a Null Pointer in C   Sometimes Work?

理解未定义的行为:C 中的空指针方法调用

尽管看似直观地预期会出现错误,但在 C 中通过空指针调用方法可能看起来会执行。此行为引发了有关编译器使用的标准合规性和优化实践的问题。

要深入研究这个问题,请考虑以下示例:

<code class="cpp">#include <iostream>
using namespace std;

class test
{
    int i;
public:
    test():i(0){ cout << "ctor called" << endl;}
    void show()
    {
        cout << "show fun called" << endl;
    }
};

int main(int argc , char *argv[])
{
    test *ptr = NULL;
    ptr->show();
    return 0;
}</code>

在此代码段中,定义了一个类测试使用构造函数和 show() 方法。在main()函数中,将一个指针ptr初始化为NULL,然后通过ptr调用show()方法。

令人惊讶的是,程序执行没有错误,并且打印了“show fun called”,没有触发构造函数。这是因为在 C 中,编译器知道空指针的类型,使其能够识别方法的代码。由于 show() 方法不使用 this 指针,因此它运行成功。

但是,此行为在 C 标准中被认为是未定义的。编译器可以通过在调用方法之前不检查指针是否为 NULL 来优化代码。虽然这种优化提高了效率,但它会损害安全性和可预测性。

以上是为什么在 C 中通过空指针调用方法有时会起作用?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn