(1) 隐藏
当我们同时编译多个文件时,所有未加 static 前缀的全局变量和函数都具有全局可见性。
char a = 'A'; // global variable
void msg()
{
printf("Hellon");
}
int main(void)
{
extern char a; // extern variable must be declared before use
printf("%c ", a);
(void)msg();
return 0;
}
程序的运行结果是:
A Hello
前面说过,所有未加 static 前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a 是全局变量,msg 是函数,并且都没有加 static 前缀,因此对于另外的源文件 main.c 是可见的。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static 可以用作函数和变量的前缀,对于函数来讲,static 的作用仅限于隐藏,而对于变量,static 还有下面两个作用。
(2)保持变量内容的持久
#include <stdio.h>
int test() {
static int a = 0; // 事实上此赋值语句从来没有执行过
return a++;
}
int main(int argc, char const* argv[]) {
printf("%dn", test());
printf("%dn", test());
printf("%dn", test());
printf("%dn", test());
return 0;
}
程序的运行结果是:
0
1
2
3
上述变量a在程序运行结束之前始终随着所在函数的被调用和退出而存在和消失。
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
共有两种变量存储在静态存储区:全局变量和 static 变量。
(3)static 的第三个作用是默认初始化为 0
int a;
int main(void) {
static int b;
int c;
static char str[10];
str[0] = 's';
str[1] = 'w';
printf("%d %d %dn", a, b, c);
printf("%s", str);
return 0;
}
程序的运行结果是:
0 0 0
sw
在这里c没有初始化,得到的值可能是随机的,也应具体的编译器环境而定,建议将其显式地初始化。在静态数据区,内存中所有的字节默认值都是 0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置 0,然后把不是 0 的几个元素赋值。如果定义成静态的,就省去了一开始置 0 的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加
评论