博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
static函数修饰全局变量和局部变量
阅读量:2383 次
发布时间:2019-05-10

本文共 1353 字,大约阅读时间需要 4 分钟。

static int a=1;

void fun1(void){    a=2;  }

void fun2(void){    int a=3;  }

void fun3(void){   static int a=4;  }

int main(int argc,char** args){ 

     printf(“%d”,a); 

     fun1( ); 

     printf(“%d”,a); 

     fun2( ); 

     printf(“%d”,a);

     fun3( );

      printf(“%d”,a); 

}

结果是:

1 2 2 2

对于static修饰全局变量,最主要的作用就是限定了这个全局变量的作用范围,不可以被其他类,其他文件引用。

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。

  全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。

  这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 

但是static修饰局部变量的话,将其放到全局区,也就是静态区,当一个函数里面有一个static修饰的局部变量的时候,如果反复调用多次,那么下一次函数用的该变量的值不会再被初始化一次了,而是采用上一次函数执行完之后此变量的值。所以,说明:1.static修饰的变量的值是可变的2.只是在此函数的调用中为全局变量。

且需要注意的是,静态局部变量只对定义它的函数体始终可见,函数体执行完过后虽然还存在,但是无法被其他的使用了

就是说明,在该函数的调用过程中,这个变量作为全局变量可以被使用。且不随着函数结束释放掉,整个程序结束的时候才被释放掉,但是不被其他的函数所引用。跟真正的全局变量还是有区别的。真正的全局变量是所有的函数都可以访问到。

static修饰局部变量

普通的局部变量是在栈上进行分配的,局部变量所处的函数被多次调用时每次调用的位置都不一样的。局部变量也可以在堆上进行动态的分配,但须记得释放空间。 

静态局部变量和普通局部变量区别如下: 
访问权限:静态局部变量只能被其作用域内的变量和函数进行访问使用,它虽然存在与程序的整个生命周期,但由于是static的所以不能被其他函数和源文件访问。 相当于只是该函数内的全局变量。
作用位置:静态局部变量被编译器存放在全局存储区(data),所以它虽然是局部的但是却存在与整个生命周期。 
值:静态的局部变量如果没有被初始化,会自动被编译器赋值为0,以后每次调用静态局部变量就都会用上次调用的值(每次函数调用静态局部变量都修改它然后离开,下次读的时候从全局存储区读的静态局部变量就是上次修改后的值)。 
注意: 
由于函数的每次调用,普通的局部变量都会重新分配,而静态局部变量会保持上次调用的值不变。正是由于static局部变量的这种特性,使得静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果,这在多线程编程时可能会成为一种隐患。

 

 

转载地址:http://pgfab.baihongyu.com/

你可能感兴趣的文章
《Linux内核修炼之道》 之 高效学习Linux驱动开发
查看>>
编写可移植C/C++程序的要点
查看>>
DirectFB代码导读
查看>>
linux fork函数浅析
查看>>
内核启动时间优化
查看>>
基于Linux的多播编程
查看>>
网络字节序
查看>>
Linux网络命令详解
查看>>
GNU C 的 __attribute__ 机制
查看>>
atoi,atol,strtod,strtol,strtoul详解
查看>>
基于HZK16的汉字显示技术
查看>>
嵌入式web服务器对比
查看>>
select 函数使用指难
查看>>
人类的15个欲望与游戏设计
查看>>
高速缓存
查看>>
kernel基本功练习
查看>>
UNIX/LINUX 平台可执行文件格式分析
查看>>
轻量级服务器选择
查看>>
补丁的制作和使用:diff和patch
查看>>
pkg-config指南
查看>>