【问题标题】:Can you return an integer by dereferencing a pointer?您可以通过取消引用指针来返回整数吗?
【发布时间】:2013-03-18 14:42:57
【问题描述】:
int f(int *x)
{
    *x = 5;
    return *x;
}

int main()
{
    int * y = 0;
    int z = f(y);
}

为什么这段代码会出现运行时错误?

【问题讨论】:

    标签: c++ pointers undefined-behavior


    【解决方案1】:

    为什么这段代码会出现运行时错误?

    因为y 是一个NULL 指针,它在f() 中被取消引用。请注意,取消引用 NULL 指针是未定义的行为。

    你可以通过取消引用指针来返回一个整数吗?

    是的,假设指针指向一个有效的int。例如:

    int main()
    {
        int y = 0;
        int z = f(&y);
    }
    

    【讨论】:

    • 为什么是“技术上”?这是未定义的行为,简单明了。
    • @KeithThompson,他特别问他为什么会遇到运行时错误,这就是原因,但不能保证会导致运行时错误。但是,我将删除“技术上”,因为它没有用。
    • 谢谢!!!!我最近才开始学习 c++。仍在学习交易技巧。
    • 值得一提的是,运行时错误是未定义行为的一种可能后果,但不是必需的。
    【解决方案2】:

    如果指针指向某个有效内存,则可以。在您的情况下,您是dereferencing a NULL (0x00) pointer,即undefined behavior(又名UB)。例如,这可以正常工作:

    int f(int *x)
    {
        *x = 5;
        return *x;
    }
    
    int main()
    {
        int value = 1986;
        int *y = &value; // Point to something valid.
        int z = f(y);
    }
    

    【讨论】:

      【解决方案3】:

      因为在int *y = 0; 之后,y 是一个不指向任何内容的指针(指向地址0)。 你的代码应该是这样的:

      int * y = new int;
      *y = 0;
      int z = f(y);
      // ...
      delete y;
      

      int y = 0;
      int z = f(&y);
      

      【讨论】:

        【解决方案4】:

        在取消引用之前检查指针并始终指定错误行为:

        int f(int *x)
        {
           if ( x )
           {
             // do something with x
           }
           else
           {
             // do something else in case null pointer
           }
        }
        

        取消引用空指针会产生空指针异常,例如您的情况。

        【讨论】:

        • 指针不为 NULL 并不意味着它指向一个有效的对象。
        • 确实如此。尽管如此,请尽力验证您的论点。
        • 总有这样的事情做的过头了。我已经编辑了我的答案,不鼓励这种行为。
        【解决方案5】:

        您将指针 y 设置为 0,这使其成为 NULL 指针:

        int * y = 0;
        

        然后您尝试在f() 中的指针 上执行间接

        *x = 5;
        ^ 
        

        在下一行,即undefined behavior。如果我们查看draft C++ standard 部分8.3.2 参考5 说:

        [...] 注意:特别是,空引用不能存在于定义良好的程序中,因为创建此类引用的唯一方法是将其绑定到通过 null 间接获得的“对象”指针,这会导致未定义的行为。 [...]

        【讨论】:

          猜你喜欢
          • 2014-08-06
          • 1970-01-01
          • 2021-07-25
          • 1970-01-01
          • 2011-10-06
          • 2017-02-24
          • 1970-01-01
          • 2019-01-14
          • 1970-01-01
          相关资源
          最近更新 更多