Существует некоторая путаница, поскольку static
в C может означать две разные вещи. Один из них - статическая продолжительность хранения, а другой - внутренняя связь. static
, используемое в качестве ключевого слова в области видимости файла, даст функцию или объект, который используется с внутренней связью.
Внутренняя связь для функции или объекта означает, что если вы объявите другую функцию в другом «файле» (это на самом деле не называется «файл», а скорее единицей перевода - TU), то это объявление будет ссылаться на a Другая функция: Имя, объявленное в этом модуле, будет «связывать» с другим объектом, чем имя, объявленное в этом другом модуле перевода, которое было «внутренним» для этого TU. То же относится и к объектам.
Независимо от того, объявлена ли переменная области файла с static
, она все равно будет иметь статическую продолжительность хранения: это означает, что она проходит всю программу и умирает после ее завершения. Другой пример объекта со статической продолжительностью хранения - строковый литерал. Где хранятся объекты со статической продолжительностью хранения, не указано, но они обычно хранятся в зависимости от того, инициализированы они или нет: переменные области видимости файла обычно хранятся в разделе с именем «.data», а неинициализированный файл Переменные -scope обычно хранятся в разделе ".bss". Помните, что если переменная не инициализирована, она будет инициализирована нулем в начале программы: раздел «.bss» обычно инициализируется нулем при реализации программы при запуске программы.
Я сказал «обычно» везде, так как место хранения вещей не указано. Например, некоторые реализации могут хранить строковые литералы в разделе только для чтения. И если у вас есть указатель области видимости файла и вы не инициализируете его, реализация инициализирует его нулевым указателем, который не обязательно является объектом со всеми нулевыми байтами:)