Основной вопрос c - Что именно происходит, когда вы объявляете статическую переменную в c? - PullRequest
1 голос
/ 21 июня 2019

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

#include <stdio.h>
void inc() {
  static int c = 0;
  c++;
  printf("%d\n", c);
}

int main(void) {
  inc();
  inc();
  inc();
  return 0;
}

Ожидаемый результат, очевидно:

1
2
3

При первом вызове функции статическая переменная c определяется и получает значение 0, что имеет смысл. Это увеличенный и напечатанный. Однако при втором вызове inc() почему целое число c поддерживается и не устанавливается в ноль, хотя код буквально говорит static int c = 0;. Какой механизм в компиляторе не дает c установить нулевое значение, как при первом вызове?

Ответы [ 2 ]

7 голосов
/ 21 июня 2019

Цитирование C11, глава §6.2.4, Длительность хранения объектов ( выделение )

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

Таким образом, инициализация внутри вызова функции не происходитна каждый вызов функции.Это происходит только один раз, прежде чем начинается выполнение main().Переменная сохраняет последнее сохраненное значение в ходе выполнения программы, т. Е. Значение сохраняется между повторными вызовами функции.

0 голосов
/ 21 июня 2019

Его время жизни - это полное выполнение программы, и его значение инициализируется перед запуском программы и только один раз.

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