Подтвердить что ты не робот

Различие между "глобальным" и "статическим глобальным"

A глобальная переменная область видимости во всех файлах, а область статическая глобальная переменная - это просто файл, в котором он объявлен. Почему так?

Где хранятся глобальные или статические глобальные переменные в памяти?

4b9b3361

Ответ 1

Существует некоторая путаница, поскольку static в C может означать две разные вещи. Один из них - статическая продолжительность хранения, а вторая - внутренняя связь. static, используемый в качестве ключевого слова в области файла, даст функцию или объект, который используется с внутренней связью.

Внутренняя привязка для функции или объекта означает, что если вы объявите другую функцию в другом "файле" (это не называется "файл", а скорее единица перевода - TU), то это объявление будет ссылаться на другую функцию: Название, объявленное в этом блоке, будет "привязываться" к другому объекту, чем имя, объявленное в этой другой единицы перевода, которая была "внутренней" для этого ТУ. То же самое относится к объектам.

Независимо от того, объявлена ​​ли переменная области видимости с помощью static, она все равно будет иметь статическую продолжительность хранения: это означает, что она живет через всю программу и умирает, когда программа завершается. Другим примером объекта, который имеет статическую длительность хранения, является строковый литерал. Там, где хранятся объекты, имеющие статическую продолжительность хранения, не указаны, но они обычно хранятся в зависимости от того, инициализированы они или нет: Инициализированные переменные области видимости обычно хранятся в разделе ".data", а неинициализированный файл -scope переменные обычно хранятся в разделе под названием ".bss". Помните, что если переменная не инициализирована, она будет нулевой инициализирована в начале программы: раздел ".bss" обычно нулевой инициализируется реализацией при запуске программы.

Я сказал "обычно" везде, так как там, где вещи хранятся, не указывается. Например, некоторые реализации могут хранить строковые литералы в разделе только для чтения. И если у вас есть указатель на область файла и не инициализируйте его, реализация инициализирует его нулевым указателем, который не обязательно является объектом со всеми нулевыми байтами:)

Ответ 2

Они оба хранятся в сегменте данных; разница в том, что глобальный имеет внешний видимый символ линкера, а статический глобальный - нет.

Ответ 3

Глобальная область видимости во всех файлах. В то время как статическая область глобальной переменной - это просто файл, где она объявлена ​​.. почему так?

Глобальная переменная предназначена для доступа из любого модуля - эта практика это что-то считается плохой практикой и должна использоваться только в случае крайней необходимости.

Статические переменные в скобках, на которые, как я предполагаю, вы говорите, когда вы говорите "статический глобальный", могут быть доступны подпрограммами в едином модуле компиляции (как правило, файл) - причина этого заключается в том, чтобы ограничить его область, При изменении кода, использующего эту переменную, существует хороший предел тому, где вам нужно посмотреть, какие другие процедуры могут быть затронуты. Это также уменьшает возможность столкновения имени.

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

Ответ 4

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

Ответ 5

В стандарте C не указывается, где они хранятся в памяти, и это не имеет отношения к программисту C. Возможность доступа к переменным контролируется компилятором и компоновщиком.

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

Ответ 6

Мы используем статический атрибут, чтобы скрыть объявления переменных и функций внутри модулей, так же, как мы будем использовать публичные и частные объявления в Java и С++. C исходных файлов играют роль модулей. Любая глобальная переменная или функция, объявленная со статическим атрибутом, является частной для этого модуля. Аналогично, любая глобальная переменная или функция, объявленная без статического атрибута, является общедоступной и может быть доступна любым другим модулем. Хотя это хорошая практика, чтобы определить как переменные или функции с ключевым словом global.

Обе эти переменные хранятся в разделе .data или .bss перемещаемого файла.

Ответ 7

Вопросы, которые нужно помнить, чтобы опрокинуть интервью Вопросы о статическом и глобальном

  • Память, выделенная для статических переменных, только один раз. Все объекты, разделяемые одной и той же памятью, но когда дело доходит до глобальной памяти переменных, выделяются для каждого объекта.
  • Статическая и глобальная переменная различаются по продолжительности жизни. Во-первых, позвольте мне объяснить, что такое жизнь и масштаб. Жизнь объекта определяет, остается ли объект в памяти, тогда как область действия объекта заключается в том, может ли он получить доступ к переменной по ее имени. A) Возможно, что объект является живым, но не видимым (не в области) b) Если объект не жив, но в области (за исключением динамически выделенных объектов, в которых вы ссылаетесь на объект через указатели).
  • Глобальная переменная имеет глобальную область видимости, я имею в виду, что к ней можно получить любую функцию из любого файла, тогда как статическая переменная имеет область действия файла, невозможно получить доступ к переменной из любого другого файла. Этот метод полезен, когда вы хотите сделать, переменная доступна для всех функций этого файла, но не выполняет функции другого файла.