目录
static对变量修饰
局部变量
普通局部变量存储于进程栈空间,使用完毕会立即释放。
静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。
普通局部变量未赋值时,打印出来的是变量对应内存中以前的数据,(因为内存中的数据不能删除,只能覆盖,给变量赋值的过程就是覆盖数据的过程),而静态局部变量(用static修饰的变量,例如:static int i;)在声明时编译器会自动给他赋值0。
不管是普通局部变量还是静态局部变量,作用域皆为局部作用域,都随着声明函数的结束而结束。
下面放一段代码感受普通局部变量和静态局部变量的区别。
void fun_static()
{
static int i;
printf("%d\n",i);
i++;
}
void fun()
{
int c;
printf("%d\n",c);
c++;
}
int main ()
{
fun_static();
fun();
printf("-------------\n");
fun_static();
fun();
printf("-------------\n");
fun_static();
fun();
printf("-------------\n");
return 0;
}
运行结果为:
0
0
-------------
1
0
-------------
2
0
-------------
因为普通变量会随着函数的结束而被释放,所以每次调用函数都是新声明一次,而静态局部变量不会随着函数的结束而改变值。
全局变量
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,
不能在其他源文件内使用。
函数
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用,且在不同文件中可以重名定义。普通函数不能重名定义,可以在其他文件中被引用,且不能在其他文件中重名定义。