A глобальная переменная область видимости во всех файлах, а область статическая глобальная переменная - это просто файл, в котором он объявлен. Почему так?
Где хранятся глобальные или статические глобальные переменные в памяти?
A глобальная переменная область видимости во всех файлах, а область статическая глобальная переменная - это просто файл, в котором он объявлен. Почему так?
Где хранятся глобальные или статические глобальные переменные в памяти?
Существует некоторая путаница, поскольку static
в C может означать две разные вещи. Один из них - статическая продолжительность хранения, а вторая - внутренняя связь. static
, используемый в качестве ключевого слова в области файла, даст функцию или объект, который используется с внутренней связью.
Внутренняя привязка для функции или объекта означает, что если вы объявите другую функцию в другом "файле" (это не называется "файл", а скорее единица перевода - TU), то это объявление будет ссылаться на другую функцию: Название, объявленное в этом блоке, будет "привязываться" к другому объекту, чем имя, объявленное в этой другой единицы перевода, которая была "внутренней" для этого ТУ. То же самое относится к объектам.
Независимо от того, объявлена ли переменная области видимости с помощью static
, она все равно будет иметь статическую продолжительность хранения: это означает, что она живет через всю программу и умирает, когда программа завершается. Другим примером объекта, который имеет статическую длительность хранения, является строковый литерал. Там, где хранятся объекты, имеющие статическую продолжительность хранения, не указаны, но они обычно хранятся в зависимости от того, инициализированы они или нет: Инициализированные переменные области видимости обычно хранятся в разделе ".data", а неинициализированный файл -scope переменные обычно хранятся в разделе под названием ".bss". Помните, что если переменная не инициализирована, она будет нулевой инициализирована в начале программы: раздел ".bss" обычно нулевой инициализируется реализацией при запуске программы.
Я сказал "обычно" везде, так как там, где вещи хранятся, не указывается. Например, некоторые реализации могут хранить строковые литералы в разделе только для чтения. И если у вас есть указатель на область файла и не инициализируйте его, реализация инициализирует его нулевым указателем, который не обязательно является объектом со всеми нулевыми байтами:)
Они оба хранятся в сегменте данных; разница в том, что глобальный имеет внешний видимый символ линкера, а статический глобальный - нет.
Глобальная область видимости во всех файлах. В то время как статическая область глобальной переменной - это просто файл, где она объявлена .. почему так?
Глобальная переменная предназначена для доступа из любого модуля - эта практика это что-то считается плохой практикой и должна использоваться только в случае крайней необходимости.
Статические переменные в скобках, на которые, как я предполагаю, вы говорите, когда вы говорите "статический глобальный", могут быть доступны подпрограммами в едином модуле компиляции (как правило, файл) - причина этого заключается в том, чтобы ограничить его область, При изменении кода, использующего эту переменную, существует хороший предел тому, где вам нужно посмотреть, какие другие процедуры могут быть затронуты. Это также уменьшает возможность столкновения имени.
При использовании глобальных переменных, если другой набор модулей также использует глобальную переменную с тем же именем для другой цели, вам придется изменить один набор, чтобы использовать другое имя. Эта проблема не существует для статических переменных.
Статические глобальные переменные недоступны из других файлов, а глобальные переменные могут быть доступны с помощью ключевого слова extern
.
В стандарте C не указывается, где они хранятся в памяти, и это не имеет отношения к программисту C. Возможность доступа к переменным контролируется компилятором и компоновщиком.
Это второй вопрос, который вы задали в этой области. Одной из основных причин использования относительно высокого уровня программирования, такого как C, является то, что вам не нужно беспокоиться об этих проблемах.
Мы используем статический атрибут, чтобы скрыть объявления переменных и функций внутри модулей, так же, как мы будем использовать публичные и частные объявления в Java и С++. C исходных файлов играют роль модулей. Любая глобальная переменная или функция, объявленная со статическим атрибутом, является частной для этого модуля. Аналогично, любая глобальная переменная или функция, объявленная без статического атрибута, является общедоступной и может быть доступна любым другим модулем. Хотя это хорошая практика, чтобы определить как переменные или функции с ключевым словом global.
Обе эти переменные хранятся в разделе .data или .bss перемещаемого файла.
Вопросы, которые нужно помнить, чтобы опрокинуть интервью Вопросы о статическом и глобальном