где и когда глобальная статическая и локальная статическая хранятся и инициализируются? - PullRequest
0 голосов
/ 13 августа 2010

include

static int i = 10;

int
main()
{
   static int i = 20;

   printf ( "i = %d\n", i );

   return 0;
}

Есть две статические переменные, одна в глобальной области видимости и одна в области функций.Компилятор не выдает ошибку «множественное определение».Не могли бы вы дать мне знать, где хранятся два статических переменных?

Ответы [ 2 ]

3 голосов
/ 13 августа 2010

Две переменные хранятся отдельно, потому что они различны - задача компилятора обеспечить их разделение.

Обе переменные инициализируются до запуска программы - это C, а не C ++, гдеправила немного отличаются.

Внутри main(), как показано, вы не можете получить доступ к глобальной переменной i (опять же, это C, а не C ++).

компилятор GCC * -Wshadowфлаг будет предупреждать вас о локальном i слежке за глобальным.

0 голосов
/ 13 августа 2010

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

Короче говоря, имена переменных являются просто декорациями, внутри компилятор работает с таблицей символов и индексами в ней. Статика инициализируется во время запуска программы путем итерации по таблице указателей на них и установки правильных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...