c语言中,静态数据有两种:
-
全局变量:定义在函数外的变量
-
静态局部变量:定义在函数内部,且被static修饰的变量
-
示例:
#include <stdio.h> //未初始化数据段 .boss //全局变量或者函数添加static关键字,表示此变量或者函数在此文件有效,其他文件不能调用 //防止变量名污染 static int data; //已初始化数据段 .data static int data1 = 10; void func(void) { //static修饰的局部变量,只初始化一遍 //因为static修饰的局部变量是在数据段,生命周期伴随整个程序,程序不结束就不释放 static int a = 0; printf("%d\n",a++); } void fun(void) { int a = 0; printf("%d\n",a++); } int main() { int a[10];//栈区 for (int i = 0; i < 10; i++) { printf("%d ",a[i]); } printf("\n"); //数据段,未初始化的静态数据 static int data[10]; for (int i = 0; i < 10; i++) { printf("%d ",data[i]); } printf("\n"); func(); func(); func(); printf("-----------\n"); fun(); fun(); fun(); }
为什么需要静态数据 ?
全局变量在默认的情况下,对所有文件可见,为某些需要在各个不同文件和函数之间访问的数据提供操作上的方便。
static修饰的全局变量,只能在本文件使用,如果未被static修饰的全局变量,所有的文件都能使用,会出现命名污染。
当我们希望一个函数退出后依然能保留局部变量的值,以便于下一次调用时还能用,静态局部变量可以帮助实现这样的功能。
注意1:
若定义时未初始化,则系统会将所有的静态数据自动初始化为0
静态数据初始化语句,只会执行一遍。
静态数据从程序开始运行时便已存在,直到程序退出时才释放。
注意2:
static修饰局部变量:使之由栈内存临时数据,变为静态数据
static修饰全局变量:使之由个文件可见的静态数据,变成为本文件可见的静态数据
static修饰的函数:使之由各文件可见的函数,变成为本文件可见的静态函数。
练习
创建一个工程main.c、add.c、add.h,在main.c和add.c分别写两个同名的子函数实现两个数值相加,add.h声明子函数,通过static解决命名冲突的问题?
//main.c
#include <stdio.h>
#include "add.h"
//static 的作用是将变量固定在本文件有效
//防止变量名字污染
static int a1 = 100;
//static修饰函数数据也是讲次函数固定在本文件有效
//其他文件无法调用
//防止变量名字污染
int main(int argc, char const *argv[])
{
int b1 = 13;
printf("%d\n",add(a1,b1));
return 0;
}
//add.h
int add(int a1,int b1);
//add.c
static int a1 = 101;
int add(int a,int b1)
{
return a1+b1;
}