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

为什么通过空指针调用方法在C中“工作”?[重复]

益富
2023-03-14

可能重复:
通过空类指针调用类方法

#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;
}

显然,不会有人打电话给他们。这是标准吗?或者只是一些编译器优化,因为这个指针没有在show()成员函数中使用?

共有3个答案

万俟光临
2023-03-14

它无效,行为未定义,实际结果取决于编译器。

公宜春
2023-03-14

如果您查看程序集(至少对于一个编译器),您可以看到它运行的原因(尽管正如许多人指出的那样,它是未定义的行为)。对于这两行:

test *ptr = NULL;
ptr->show();

生成此程序集(在我刚刚尝试的一个编译器中):

00000004: C7 45 FC 00 00 00  mov         dword ptr [ebp-4],0
          00
0000000B: 8B 4D FC           mov         ecx,dword ptr [ebp-4]
0000000E: E8 00 00 00 00     call        ?show@test@@QAEXXZ

它在堆栈上推送NULL(0)并调用该方法,因为该方法的地址与实际对象实例无关。

颜霖
2023-03-14

调用该方法不需要指针。指针的类型是已知的,因此方法的代码是已知的。该方法不使用this,因此它可以很好地运行代码。这是一种未定义的行为,但不检查指针是否为NULL更有效,因此它会运行。

 类似资料:
  • 我在Rust中尝试函数指针魔术,最后得到了一个代码片段,我完全无法解释它为什么要编译,甚至无法解释它为什么要运行。 我无法解释为什么调用的方法是在

  • 本文向大家介绍为什么我们在C ++中通过引用传递指针?,包括了为什么我们在C ++中通过引用传递指针?的使用技巧和注意事项,需要的朋友参考一下 如果需要修改指针而不是指针指向的对象,则可以按引用传递指针。 这是如何通过引用传递指针的示例- 示例 输出结果

  • 本文向大家介绍C#通过指针读取文件的方法,包括了C#通过指针读取文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#通过指针读取文件的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • C++ 函数 向函数传递参数的指针调用方法,把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。 按指针传递值,参数指针被传递给函数,就像传递其他值给函数一样。因此相应地,在下面的函数 swap() 中,您需要声明函数参数为指针类型,该函数用于交换参数所指向的两个整数变量的值。 // 函数定义 void swap(int *x, in

  • 我创建了一个名为InputControl的类。我正在使用一个名为GLFW的库和一个函数glfwsetkeycallback。该函数定义为: E0167“void(inputcontrol::*)(GLFWwindow*window,int key,int scancode,int action,int mods)”类型的参数与“GLFWKeyFun”类型的参数不兼容

  • 通过将函数传递给函数call by pointer方法call by pointer将参数的地址复制到形式参数中。 在函数内部,该地址用于访问调用中使用的实际参数。 这意味着对参数所做的更改会影响传递的参数。 要通过指针传递值,参数指针将像任何其他值一样传递给函数。 因此,您需要将函数参数声明为指针类型,如以下函数swap() ,该函数swap()其参数指向的两个整数变量的值。 // functi