【问题标题】:Returning pointer to static local variable返回指向静态局部变量的指针
【发布时间】:2016-02-09 04:59:26
【问题描述】:

当我编译这段代码时,

#include <stdio.h>

int *foo();

int main()
{
        *foo()++;
        return 0;
}

int *foo()
{
        static int bar;
        return &bar;
}

Clang 显示错误:

static2.c:7:8: error: expression is not assignable

为什么是非法的?我想bar 有静态存储持续时间,所以它的生命周期是程序的整个执行过程。虽然bar 本身对main() 不可见,但指针应该能够修改它。

这个版本的foo() 也不起作用,Clang 给了我同样的错误:

int *foo()
{
    static int bar;
    static int* ptr = &bar;
    return ptr;
}

【问题讨论】:

    标签: c static declaration


    【解决方案1】:

    由于运算符优先级(后缀增量++,高于取消引用*)(参见http://en.cppreference.com/w/cpp/language/operator_precedence),

        *foo()++;
    

    相当于:

        *(foo()++);
    

    这是无效的,因为foo 的返回值是一个指针,而foo() 的计算结果是一个临时指针。您不能增加或减少临时指针。

    您可以使用以下方法修复它:

        (*foo())++;
    

    【讨论】:

      【解决方案2】:

      由于您使用返回值的方式,它是非法的。 bar是可见的,可以在main()中使用

      问题出在

      *foo()++;
      

      您需要在括号中提供表达式

      (*(foo()))++;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-02
        • 2016-10-25
        • 2014-05-14
        • 2020-10-13
        • 1970-01-01
        • 2021-02-21
        相关资源
        最近更新 更多