【问题标题】:C Pointers Example - What is so bad about this? [duplicate]C 指针示例 - 这有什么不好的? [复制]
【发布时间】:2015-04-28 11:26:22
【问题描述】:

在我们的讲座中,我们有以下示例:

int *foo(int x) {
    return &x;
}

int* pt = foo(x);
*pt = 17;

这是一个不好的例子,但没有进一步解释。为什么这样不好?

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    坏事是你返回一个指向自动局部变量的指针。一旦函数返回,它将不再存在,然后语句 *pt = 17; 将导致程序行为异常。

    可以返回指向static 局部变量的指针。

    int *foo() {
        static int x;
        return &x;
    }
    int* pt = foo();
    *pt = 17; 
    

    【讨论】:

      【解决方案2】:

      这里

      int *foo(int x) {
      

      x 是一个局部的非静态变量。通过做

      return &x;
      

      您返回局部变量x 的地址。只要函数存在,它就存在,当函数退出时,这个地址就失效了,你不能玩。通过使用

      *pt = 17;
      

      您取消引用此地址并将17 写入此无效内存位置。这会触发Undefined Behavior。这就是给定代码不好的原因。

      【讨论】:

        【解决方案3】:

        foo 中,变量x 是本地变量,因此在方法退出后它不再存在。当一个函数返回时,它的自动局部变量被丢弃,所以在这种情况下返回的指针是无效的(它指向一个不再存在的数组)。

        int* pt = foo(x);
        *pt = 17; 
        

        因此,现在访问pt 会得到Undefined Behavior。你应该 malloc 代替它:

        int *foo() 
        {
            int *x = malloc(sizeof(int));
            *x = 0;
            return x;
        }
        
        int* pt = foo();
        *pt = 17;
        free(pt);
        

        【讨论】:

          猜你喜欢
          • 2017-02-25
          • 2016-08-15
          • 2017-08-26
          • 2012-05-08
          • 2016-06-03
          • 2016-12-15
          • 2017-02-21
          • 1970-01-01
          • 2014-06-25
          相关资源
          最近更新 更多