Статические переменные в 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.
Ссылки:
- http://en.wikipedia.org/wiki/Translation_unit_(programming)
- http://en.wikipedia.org/wiki/Call_stack