Где хранятся глобальные переменные
Перейти к содержимому

Где хранятся глобальные переменные

  • автор:

Локальные vs глобальные переменные: область видимости и хранение

Локальная переменная – это как секрет, который известен только внутри определённой комнаты (функции) и забывается, как только выходишь. ���� Она работает там и только там, помогая избежать путаницы снаружи.

Локальные переменные решают проблему «загромождения» и путаницы, удерживая данные аккуратно упакованными там, где они нужны – внутри блоков или функций. Это делает код чище и безопаснее, предотврагая случайные изменения данных, которые могли бы повлиять на всю программу. ��️

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

Пример

Давайте представим, что вы готовите обед и у вас есть рецепт блюда, который требует определенное количество ингредиентов. В программировании, это можно сравнить с функцией, которая готовит блюдо, а ингредиенты – это локальные переменные.

Скопировать код

def приготовить_салат(огурцы, помидоры, лук): # Здесь огурцы, помидоры и лук – локальные переменные нарезанные_огурцы = огурцы * 0.5 # Половина от всего количества огурцов нарезанные_помидоры = помидоры * 0.5 # Половина от всего количества помидоров нарезанный_лук = лук * 0.25 # Четверть от всего количества лука # Смешиваем ингредиенты салат = нарезанные_огурцы + нарезанные_помидоры + нарезанный_лук return салат # Вызываем функцию с конкретными значениями готовый_салат = приготовить_салат(огурцы=2, помидоры=3, лук=1) print("Готовый салат:", готовый_салат)

�� В этом примере огурцы , помидоры и лук являются локальными переменными функции приготовить_салат . Они как ингредиенты, доступные только внутри этой «кулинарной процедуры». Как только функция выполнена, все остатки ингредиентов (то есть локальные переменные) исчезают, не засоряя вашу «кухню» (то есть область видимости вне функции).

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

Основы локальных и глобальных переменных

Локальные переменные – это как инструменты в ящике инструментов: они доступны только внутри определенной области (функции или блока кода), где были объявлены. Это означает, что они не видны и не доступны за пределами этой области. Такой подход позволяет избежать конфликтов имен и упрощает управление данными, делая код более понятным и легким для отладки.

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

Хранение и жизненный цикл

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

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

Плюсы и минусы

Использование локальных переменных позволяет:

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

Однако, использование глобальных переменных может быть оправдано, когда:

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

Статические локальные переменные

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

Примеры в разных языках

В Python, локальные переменные объявляются внутри функции и не доступны за её пределами:

Статические глобальные переменные

Когда спецификатор static применяется к глобальной переменной, он сообщает компилятору о необходимости создания глобальной переменной, которая будет известна только в файле, где статическая глобальная переменная объявлена. Это означает, что, даже если переменная является глобальной, другие подпрограммы в других файлах не будут знать о ней. Таким образом, не возникает повода для побочных эффектов. В некоторых ситуациях, где локальные статические переменные неприменимы, можно создать раздельно компилируемый файл и использовать его без боязни возникновения побочных эффектов.

Для того, чтобы понять, как можно использовать статические глобальные переменные, пример с генератором последовательности из предыдущего раздела переделан таким образом, что стартовое значение может использоваться для инициализации серии путем вызова второй функции — series_start(). Ниже показан файл, содержащий series(), series_start() и series_num:

/* все должно быть в одном файле * /
static int series_num;

int series(void) ;
void series_start(int seed);

series(void)
series_num = series_num + 23;
return(series_num);
>

/* инициализация series_num */
void series_start (int seed)
series_num = seed;
>

Вызывая series_start() с некоторым известным целым числом, мы инициализируем генератор последовательности. После этого вызов series() приводит к генерации следующего элемента последовательности.

Имена статических локальных переменных известны только функции или блоку кода, в которых они объявлены, а имена статических глобальных переменных известны только в файле, в котором они находятся. Это означает, что если поместить функции series() и series_start() в отдельный файл, то можно использовать данные функции, но нельзя обращаться к переменной series_num. Она спрятана от остального кода программы. Фактически можно даже объявлять и использовать другую переменную, называемую series_num, в программе (в другом файле) и не бояться напутать. В сущности модификатор static разрешает использование функциями переменных, не беспокоя другие функции.

Статические переменные позволяют прятать части программы. Это может привести к большим преимуществам при разработке больших и сложных программ.

Глобальная переменная с++

Подскажите, как реализовать следующее. Есть примерно 8 пар .h и .cpp файлов, в одном из них есть функция, которая считывает введённые данные. Мне надо запомнить эти данные, чтобы я мог в остальных файлах ими пользоваться. Как это реализовать? В интернете что-то нашел про extern , но так и не получилось ничего.

Отслеживать
11.5k 8 8 золотых знаков 43 43 серебряных знака 70 70 бронзовых знаков
задан 6 апр 2011 в 13:20
Максим Игнатьев Максим Игнатьев
66 3 3 серебряных знака 10 10 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Везде, где собираетесь использовать глобальную переменную, включите её декларацию (declaration), например, пусть она будет в каком-то общем хедере. А только в одном из модулей cpp определите эту переменную (definition)

int GlobalVariable; // определение в одном файле. здесь переменная "будет жить" void SomeFunction(); void AnotherFunction(); int main()
extern int GlobalVariable; // декларация во всех пользующихся файлах void SomeFunction()
extern int GlobalVariable; // декларация во всех пользующихся файлах void AnotherFunction()

Отслеживать
11.5k 8 8 золотых знаков 43 43 серебряных знака 70 70 бронзовых знаков
ответ дан 6 апр 2011 в 14:13
1,905 13 13 серебряных знаков 16 16 бронзовых знаков

Спасибо все заработало! А если мне так надо создать еще и тип char, то я в главном файле делаю так: char* ci[size], а уже во всех других так: extern char* ci[size]. Это правельно? ведь сам массив я не могу передовать значит просто выделяю место и создаю указатель?

6 апр 2011 в 16:31

Смотря что хотите получить. char* ci[size] — это будет массив на size элементов указателей на строки. Если же хотите работать со строкой, то нужно char ci[size]. Да, в других модулях нужно будет написать extern char* ci[size] или extern char ci[size] соответственно. Касательно передачи массива напоминаю, что имя массива — указатель на начало массива.

6 апр 2011 в 17:51

Мне нужно работать со строкой. Если я объявляю в клавном файле вот так: char cI[BUF_SIZE]; то программа не компилируется и выдает следующую ошибку: globVars.obj : error LNK2005: «char * cI» (?cI@@3PADA) already defined in Diplom.obj объявляю в другом файле переменную следующим образом(extern char cI[BUF_SIZE]; и пробывал так еще extern char* cI[BUF_SIZE];), но если я в главном файле делаю так: char* cI[BUF_SIZE]; то все компилируется, но как я понял это будет не то что мне надо. 🙁 подскажите что не так?

Руководство по глобальным переменным

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

С другой стороны, переменная, объявленная внутри определенного блока кода, будет видна только внутри этого же блока — она называется локальной.

Разберемся с этими понятиями на примере.

Пример локальных и глобальных переменных

 
 
def sum(): a = 10 # локальные переменные b = 20 c = a + b print("Сумма:", c) sum()

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

Для решения этой проблемы используются глобальные переменные.

Теперь взгляните на этот пример с глобальными переменными:

 
 
a = 20 # определены вне функции b = 10 def sum(): c = a + b # Использование глобальных переменных print("Сумма:", c) def sub(): d = a - b # Использование глобальных переменных print("Разница:", d) sum() sub()
Сумма: 30 Разница: 10

В этом коде были объявлены две глобальные переменные: a и b . Они используются внутри функций sum() и sub() . Обе возвращают результат при вызове.

Если определить локальную переменную с тем же именем, то приоритет будет у нее. Посмотрите, как в функции msg это реализовано.

 
 
def msg(): m = "Привет, как дела?" print(m) msg() m = "Отлично!" # глобальная переменная print(m)
Привет, как дела? Отлично!

Здесь была объявлена локальная переменная с таким же именем, как и у глобальной. Сперва выводится значение локальной, а после этого — глобальной.

Ключевое слово global

Python предлагает ключевое слово global , которое используется для изменения значения глобальной переменной в функции. Оно нужно для изменения значения. Вот некоторые правила по работе с глобальными переменными.

Правила использования global

  • Если значение определено на выходе функции, то оно автоматически станет глобальной переменной.
  • Ключевое слово global используется для объявления глобальной переменной внутри функции.
  • Нет необходимости использовать global для объявления глобальной переменной вне функции.
  • Переменные, на которые есть ссылка внутри функции, неявно являются глобальными.

Пример без использования глобального ключевого слова.

 
 
c = 10 def mul(): c = c * 10 print(c) mul()
line 5, in mul c = c * 10 UnboundLocalError: local variable 'c' referenced before assignment

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

 
c = 10 def mul(): global c c = c * 10 print("Значение в функции:", c) mul() print("Значение вне функции:", c)
Значение в функции: 100 Значение вне функции: 100

Здесь переменная c была объявлена в функции mul() с помощью ключевого слова global . Ее значение умножается на 10 и становится равным 100. В процессе работы программы можно увидеть, что изменение значения внутри функции отражается на глобальном значении переменной.

Глобальные переменные в модулях Python

Преимущество использования ключевого слова global — в возможности создавать глобальные переменные и передавать их между модулями. Например, можно создать name.py, который бы состоял из глобальных переменных. Если их изменить, то изменения повлияют на все места, где эти переменные встречаются.

1. Создаем файл name.py для хранения глобальных переменных:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *