Это компилируется для меня (хотя с предупреждением о типе возврата от main()
).
Результат с точки зрения того, что main()
будет печатать, не определен, поскольку вы не инициализировали значение var
в main.c. Наиболее вероятный результат, когда компилятор вызывается без оптимизации, равен нулю, поскольку ОС обнулит физическую память, предоставленную процессу для хранения данных (ОС делает это, чтобы избежать утечки конфиденциальных данных между процессами).
Статический спецификатор для определения переменной var
означает, что переменная не видна за пределами исходного файла, в котором она определена. Это также означает, что каждая из трех var
переменных получает свое собственное место хранения.
Если мы добавим printf("[module name] *var=%p\n", &var)
к foo()
, bar()
и main()
соответственно, чтобы напечатать адрес ячейки памяти, в которой хранятся эти три переменные, вы должны получить что-то вроде этого: -
foo() *var=0x8049620
bar() *var=0x8049624
main() *var=0x8049628
Обратите внимание, что каждая переменная получает свое собственное место хранения. Код в каждом исходном файле будет иметь доступ к версии var, определенной для этого исходного файла. Использование static
подобным образом в файлах .c обычно используется для реализации концепции сокрытия информации в C.