返回指向静态局部变量的指针

时间:2016-02-09 04:59:27

标签: c static declaration

编译此代码时,

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

2 个答案:

答案 0 :(得分:6)

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

    *foo()++;

相当于:

    *(foo()++);

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

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

    (*foo())++;

答案 1 :(得分:2)

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

中使用

问题在于

*foo()++;

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

(*(foo()))++;