2

Я изучаю классы хранения в C.I имеют простой кодСтатические переменные локальными для работы

enter code here 
int f1() 
{ 
    static int i=0; 
    i++; 
    printf("%d",i); 
} 

int f2() 
{ 
    printf("%d",i); 
} 

int main() 
{ 
    f1();f2();f1();f2(); 
} 

Компилятор дает ошибку как «я» не декларируется в f2(). Как я думал, статические переменные памяти выделяются в разделе данных программной памяти. Таким образом, любая функция в этом файле должна иметь к ней доступ.

Как компилятор знает, что переменная, локально объявленная в функции, ограничена только этой функцией? Как компилятор оценивает это?

+0

http://stackoverflow.com/questions/6223355/static-variables-in-class-methods Возможный ответ –

ответ

4

Хотя время жизни static переменный не связана с областью, где она определена (в отличие от переменного с автоматической продолжительностью хранения):

{ 
    static int i=0; 
    i++; 
    ... 
    { 
     i++; // <-- still well defined, even in nested scope 
    } 
} 
i++; // <-- undefined 

она доступна только в пределах этой области. Компилятор просто проверяет, был ли ранее задан символ i, и он видит, что i не был определен в этой области (static int i=0; определяет переменную, которая доступна локально ~ компилятору, не заботятся о ее жизни).

В случае, если вам это нужно, чтобы быть доступным из его объема, вы должны передать его из нее по ссылке (его адрес) или сделать его глобальным:

static int i = 0; 
... 
{ 
    i++; 
} 
... 
i++; // <-- accessing global variable 
+0

Да, сделав его глобальным или передавая ссылку, я могу получить к нему доступ в любом месте. Но как компилятор думает о конкретной переменной, привязанной к конкретной функции в случае статического распределения? – Arya

+0

@Purisima: Смотрите мое редактирование. Теперь это должно быть более ясным. – LihO

1

статических переменные действительно хранятся в разделе данных, но только в рамках этой функции они объявлены.

Вы должны сделать следующий

static int i=0; 
int f1() 
{ 
    i++; 
    printf("%d",i); 
} 

int f2() 
{ 
    printf("%d",i); 
} 

теперь переменным я могу получить доступ по обеим функциям.

+0

См. Мой отредактированный вопрос. – Arya

+0

К сожалению, я не видел ваши изменения до сих пор – hamon

1

Всегда помните, что Scope это время компиляции не время выполнения. C имеет плоскую структуру памяти. Это означает, что вы можете получить доступ к чему угодно из любого места. Вы можете сделать указатель i и получить к нему доступ. Но C говорит о неопределенном поведении, когда область действия переменной завершена. Это ограничение компилятора полностью. Вы также можете увидеть ссылку - Is scope in C related only to compile time, as we know we can access any memory at run time? для более подробной информации. Кроме того, это может быть полезно A static variable and a global variable both reside in data segment. Still, static variable has scope limited. Why?. Таким образом, это единица перевода, которая выдает вам ошибку.

Давайте рассмотрим это на примере.

#include "stdio.h" 


int *ptr_i; 

void func1() 
{ 
    static int i = 0; 

    ptr_i = &i; 

    i++; 
    printf("The static i=%d\r\n",i); 

} 

int main(int argc, char *argv[]) 
{ 

    func1(); 

    (*ptr_i)++; 

    func1(); 


} 

Результат этой программы следующий. Статический i = 1 Статический i = 3

Как вы могли понять, сфера не является временем выполнения. Мне удалось получить доступ к ячейке памяти, используемой i через указатель. Таким образом, вы можете получить доступ к любой памяти в C, поскольку это плоская структура памяти. В этом примере я обратился к памяти i, используя указатель на i. Примечание. Компилятор никогда не выдавал никаких ошибок. Таким образом, сфера - это время компиляции, а не время выполнения.

+0

Если это так, то что именно использует область применения? Почему этот стандарт разработан?Можете ли вы объяснить его использование, представив любой пример? – Arya

+0

Я пересмотрел свой ответ, пожалуйста, проверьте его –

Смежные вопросы