Как предполагает статический префикс, переменная находится в статической памяти, которая содержит переменные, адреса которых известны во время компиляции (несколько педантичный способ сказать с глобальными переменными). Это отличается от автоматических переменных (размещаемых в стеке) и динамических переменных (размещаемых в куче с помощью malloc).
Инициализация статических переменных в функциях (или других статических) выполняется перед запуском программы. Точнее, это означает, что это может быть только какое-то постоянное выражение, которое компилятор может получить во время компиляции.
Это означает, что следующая программа недействительна:
int f(int x){
return x+1;
}
int main(){
static int a = f(1);
return a;
}
Когда я компилирую его с помощью gcc, он, как и ожидалось, выдает следующее сообщение:
error: initializer element is not constant
Однако при запуске программы вы можете изменить значение статических переменных, как и любое другое.