返回指向静态局部变量的指针
Returning pointer to static local variable
当我编译这段代码时,
#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;
}
由于您使用 return 值的方式,它是非法的。 bar
可见,可用于main()
问题在于
*foo()++;
您需要提供括号中的表达式
(*(foo()))++;
由于运算符优先级(后缀递增,++
,高于解引用,*
)(参见http://en.cppreference.com/w/cpp/language/operator_precedence),
*foo()++;
相当于:
*(foo()++);
这是无效的,因为 foo
的 return 值是一个指针,而 foo()
计算为一个临时指针。您不能递增或递减临时指针。
您可以使用以下方法修复它:
(*foo())++;
当我编译这段代码时,
#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;
}
由于您使用 return 值的方式,它是非法的。 bar
可见,可用于main()
问题在于
*foo()++;
您需要提供括号中的表达式
(*(foo()))++;
由于运算符优先级(后缀递增,++
,高于解引用,*
)(参见http://en.cppreference.com/w/cpp/language/operator_precedence),
*foo()++;
相当于:
*(foo()++);
这是无效的,因为 foo
的 return 值是一个指针,而 foo()
计算为一个临时指针。您不能递增或递减临时指针。
您可以使用以下方法修复它:
(*foo())++;