2016-02-09 2 views
0

Когда я скомпилировать этот код,возвращающую указатель на статическую локальную переменную

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

ответ

6

Из-за приоритет операторов (приращение суффикса, ++, является выше, чем разыменование, *) (http://en.cppreference.com/w/cpp/language/operator_precedence),

*foo()++; 

эквивалентно:

*(foo()++); 

Это является недопустимым, так как возвращаемое значение foo является указателем и foo() вычисляет временной указатель. Вы не можете увеличивать или уменьшать временный указатель.

Вы можете это исправить с помощью:

(*foo())++; 
2

Его незаконным из-за того, как вы используете возвращаемое значение. bar видна и может быть использована в main()

Проблемы с

*foo()++; 

Вы должны обеспечить выражение в скобках

(*(foo()))++; 
Смежные вопросы