Статические переменные в C перераспределяются каждый раз, когда вызывается родительская функция? - PullRequest
0 голосов
/ 10 ноября 2009

Предположим, у меня есть статическая переменная, объявленная внутри функции в C.

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

Если оно перераспределяется, почему всегда сохраняется последнее значение?

Пример:

void add()
{
    static int x = 1;
    x++;
    printf("%d\n",x);
}

int main()
{
    add(); // return 2
    add(); // return 3
    add(); // return 4
}

Ответы [ 6 ]

13 голосов
/ 10 ноября 2009

Нет - статические переменные - это в основном глобальные переменные, которые живут в локальном пространстве имен.

3 голосов
/ 10 ноября 2009

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

2 голосов
/ 10 ноября 2009

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

2 голосов
/ 10 ноября 2009

Нет,

Как еще сохранить значение между вызовами функций?

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

1 голос
/ 10 ноября 2009

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

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

Это означает, что следующая программа недействительна:

int f(int x){
    return x+1;
}

int main(){
    static int a = f(1);
    return a;
}

Когда я компилирую его с помощью gcc, он, как и ожидалось, выдает следующее сообщение:

error: initializer element is not constant

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

1 голос
/ 10 ноября 2009

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

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