一. 为什么需要使用static
-
全局变量在默认的情况下,对所有文件可见,为某些需要在各个不同文件和函数之间访问的数据提供操作上的方便。
-
static修饰的全局变量,只能在本文件使用,如果未被static修饰的全局变量,所有的文件都能使用,会出现命名污染。
-
当我们希望一个函数退出后依然能保留局部变量的值,以便于下一次调用时还能用,静态局部变量可以帮助实现这样的功能。
二.static作用
-
若定义时未初始化,则系统会将所有的静态数据自动初始化为0
-
静态数据初始化语句,只会执行一遍。
-
静态数据从程序开始运行时便已存在,直到程序退出时才释放。
-
static修饰局部变量:使之由栈内存临时数据,变为静态数据
-
static修饰全局变量:使之由个文件可见的静态数据,变成为本文件可见的静态数据
-
static修饰的函数:使之由各文件可见的函数,变成为本文件可见的静态函数。
这里我们通过一段简单的代码验证
通过代码验证注意事项1和注意事项2
#include <stdio.h>
// 验证1:若定义时未初始化,则系统会将所有的静态数据自动初始化为0
void func1()
{
int b[100];
static int a[100];
for(int i = 0; i < 100; i++)
printf("a:%d,b:%d\n",a[i],b[i]);
}
//静态数据初始化语句,只会执行一遍
void func()
{
// static修饰的变量只初始化一遍
// 生命周期为程序周期,局部函数结束不释放空间
static int a = 0;
int b = 0;
printf("a:%d,b:%d\n",++a,++b);
}
//静态数据从程序开始运行时便已存在,直到程序退出时才释放。
int *func2()
{
//int a = 10;
//return &a; // 警告,段错误
static int a = 10;
return &a;
}
int main(int argc, char const *argv[])
{
// func();
// func();
// func();
// func();
//func1();
int *ret = func2();
printf("%d\n",*ret);
return 0;
}