尽管看似直观地预期会出现错误,但在 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中文网其他相关文章!