2016-12-15 4 views
0

Статические переменные хранятся в сегменте данных программы, в отличие от автоматических переменных, которые хранятся в секции стека. Предположим, что я пишу код, как показано ниже.Устранение статических переменных хранения

#include <stdio.h> 
void temp(); 
int main() 
{ 
    static int a=10; 
    temp(); 
    return 0; 
} 
void temp() 
{ 
    static int a=20; 
} 

Где такое же статическое имя переменной определено в 2 функциях. В макете сегмента данных будут две переменные с одинаковым именем. Разве это не путается при компиляции/исполнении? как этого избежать в настоящее время?

ответ

2

Эти две статические переменные имеют разные области видимости, поэтому они не конфликтуют, static - это класс хранения, который определяет, где хранить эту переменную. его не связано с областью переменных.

В макете сегмента данных будет 2 переменные с таким же именем

Существует нет имен в сегменте данных, переменные просто идентифицируются по их адресам, а не имена

1

После компилятор скомпилировал ваш исходный файл, сами переменные больше не существуют в сгенерированном коде, только их местоположений.

Вот почему у вас могут быть две разные переменные static с тем же именем в двух разных функциях.

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

0

В макете сегмента данных будут две переменные с одинаковым именем. Разве это не путается во время компиляции/исполнения?

Здесь приводится значение переменной.

a в temp() воли тени a в main() когда temp() работает. Это означает, что при запуске temp() выполняется статическая локальная переменная a. Когда управление возвращается к main, тогда действует версия a в main.

+2

Нет, здесь нет тени. Было бы, если бы был объявлен глобальный 'a'. –

+0

@MichaelWalz Затенение происходит независимо от того, статично оно или нет. – artm

+2

Да, 'static' не имеет значения, но' a' (статический или нет) в 'temp()' не тень 'a' (статический или нет) в' main() '. Он затеняет ранее объявленную _global_ переменную 'a' (статическую или нет). [Читайте это] (https://en.wikipedia.org/wiki/Variable_shadowing) для более подробной информации. –

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