путаница в отношении статических переменных - PullRequest
2 голосов
/ 24 июля 2010

У меня путаница в понятиях статического целого числа. Когда я инициализирую статическое целое число в главной функции, т.е.1004 *

i++;

i становится 1.

Теперь программа завершается.Я хочу знать, что программа выдаст при следующем запуске.Кроме того, что произойдет, если вся программа закрыта?Я понимаю, что первая строка - это static int i;таким образом, следующее значение при следующем запуске функции должно сохранять значение i, когда оно было запущено ранее.Если так, в чем преимущество создания статической переменной?Имеет ли переменная ограничение по времени или она может храниться вечно?Каким будет значение, если я снова запустил функцию?

Ответы [ 3 ]

5 голосов
/ 24 июля 2010

В C «статический» означает, что переменная имеет локальную область видимости в глобальном хранилище.

Область переменных в C - это блок. Другими словами, переменные могут использоваться внутри объявленного им блока. И обычно они просто сохраняют свои значения до конца блока, теряясь после этого. Пример:

{
   int a; 
   // Only a can be used here
   {
      int b;
      // a and b can be used here
      {
         int c;
         // a,b and c can be used here
      }
      //just a and b can be used here. c is not available anymore
    }
    // only a can be used here. Neither b nor c are available anymore
 }

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

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

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

Например, функция ниже имеет локальную переменную. Локальные переменные имеют область видимости блока (это означает, что вы можете получить доступ только к переменной 'var' внутри блока {}, в котором она объявлена, в случае ниже внутри функции):

void countFunction(void)
{
  int var = 0;
  var = var + 1;
  printf("Value is %d\n", var);
}

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

Если вы измените var на static,

void countFunction(void)
{
  static int var = 0;
  var = var + 1;
  printf("Value is %d\n", var);
}

При первом вызове функции var инициализация будет равна 0, и функция покажет «Значение равно 1». Тем не менее, во второй раз, var будет размещен уже и в глобальном пространстве. Он не будет инициализирован снова, и функция отобразит «Значение равно 2».

Это при выполнении программы.

Хотя статическая переменная выделяется до тех пор, пока ваша программа выполняется, она не сохраняет свое значение после ее завершения (программа освободит всю свою память). Единственный способ сохранить любое значение для следующего запуска - сохранить его на энергонезависимом носителе, например на диске.

Надеюсь, это поможет.

3 голосов
/ 24 июля 2010

Это снова будет 0, потому что при завершении программы все памяти / переменных потеряны. Так в чем же преимущество Статическая

Это полезно, если вы не завершаете свою программу :) Например, она может использоваться для подсчета количества вызовов функции, если вы используете статическую переменную в этой функции, и увеличивать ее при каждом вызове. Это всего лишь простой пример, но, конечно, его можно использовать более практично.

Подробнее:

C Статические переменные

1 голос
/ 24 июля 2010

Значение i будет 0 при следующем запуске приложения.Инициализация в 0 - это инициализация по умолчанию (что очень редко встречается в остальной части C), которая происходит при запуске программы.

Как вы представляете, что она будет храниться где-то между выполнением?Всякий раз, когда ваше приложение завершается, его память будет возвращена операционной системой.Следовательно, блок памяти, в котором хранится i, также будет потерян.

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