Что означает «статический» в C? - PullRequest
987 голосов
/ 21 февраля 2009

Я видел слово static, используемое в разных местах кода C; это как статическая функция / класс в C # (где реализация разделяется между объектами)?

Ответы [ 18 ]

6 голосов
/ 21 февраля 2009

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

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

5 голосов
/ 11 марта 2009

Если вы объявите это в mytest.c файле:

static int my_variable;

Тогда эту переменную можно увидеть только из этого файла. Переменная не может быть экспортирована в другом месте.

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

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

4 голосов
/ 21 марта 2015

Статические переменные в C имеют время жизни программы.

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

Например:

void function()
{
    static int var = 1;
    var++;
    printf("%d", var);
}

int main()
{
    function(); // Call 1
    function(); // Call 2
}

В приведенной выше программе var сохраняется в сегменте данных. Его время жизни - вся программа на Си.

После вызова функции 1 var становится 2. После вызова функции 2 var становится 3.

Значение var не уничтожается между вызовами функций.

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

Инициализированные статические переменные хранятся в сегменте данных программы C, а неинициализированные - в сегменте BSS.

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

Чтобы попробовать это:

file1.c

static int x;

int main()
{
    printf("Accessing in same file%d", x):
}

file2.c

    extern int x;
    func()
    {
        printf("accessing in different file %d",x); // Not allowed, x has the file scope of file1.c
    }

run gcc -c file1.c

gcc -c file2.c

Теперь попробуйте связать их, используя:

gcc -o output file1.o file2.o

Это даст ошибку компоновщика, так как x имеет область файла file1.c, и компоновщик не сможет разрешить ссылку на переменную x, используемую в file2.c.

Ссылки:

  1. http://en.wikipedia.org/wiki/Translation_unit_(programming)
  2. http://en.wikipedia.org/wiki/Call_stack
4 голосов
/ 01 мая 2014

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

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

3 голосов
/ 22 декабря 2014

Статическая переменная - это специальная переменная, которую вы можете использовать в функции, она сохраняет данные между вызовами и не удаляет их между вызовами. Например:

void func(){
    static int count; // If you don't declare its value, the value automatically initializes to zero
    printf("%d, ", count);
    count++;
}

void main(){
    while(true){
        func();
    }
}

Выход:

0, 1, 2, 3, 4, 5, ...

2 голосов
/ 03 июня 2018

Есть 2 случая:

(1) Объявлены локальные переменные static: размещены в сегменте данных вместо стека. Его значение сохраняется при повторном вызове функции.

(2) Объявлены глобальные переменные или функции static: Невидимая внешняя единица компиляции (т. Е. Локальные символы в таблице символов во время компоновки).

2 голосов
/ 23 марта 2014

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

1 голос
/ 13 февраля 2019

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

#include<stdio.h> 
int counterFunction() 
{ 
  static int count = 0; 
  count++; 
  return count; 
} 

int main() 
{ 
  printf("First Counter Output = %d\n", counterFunction()); 
  printf("Second Counter Output = %d ", counterFunction()); 
  return 0; 
}

Выше программа даст нам такой вывод:
Выход первого счетчика = 1
Выход второго счетчика = 1
Потому что, как только мы вызываем функцию, она инициализирует count = 0. И пока мы выполняем counterFunction, она уничтожает переменную count.

...