C语言static变量和函数

本文深入探讨了C语言中static关键字的使用,包括其如何限制全局变量和函数的作用域,避免命名冲突,以及如何用于局部变量以保持其值在多次函数调用之间的持久性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接:http://c.biancheng.net/view/vip_2121.html

我们知道,全局变量和函数的作用域默认是整个程序,也就是所有的源文件,这给程序的模块化开发带来了很大方便,让我们能够在模块 A 中调用模块 B 中定义的变量和函数,而不用把所有的代码都集中到一个模块。

但这有时候也会引发命名冲突的问题,例如在 a.c 中定义了一个变量 n,在 b.c 中又定义了一次,链接时就会发生重复定义错误,原因很简单,变量只能定义一次。

如果两个文件都是我们自己编写的或者其中一个是,遇到这样的情况还比较好处理,修改变量的名字即可;如果两个文件都是其他程序员编写的,或者是第三方的库,修改起来就颇费精力了。

实际开发中,我们通常将不需要被其他模块调用的全局变量或函数用 static 关键字来修饰,static 能够将全局变量和函数的作用域限制在当前文件中,在其他文件中无效。下面我们通过一个实例来演示。

module.c 源码:

 
  1. #include <stdio.h>
  2.  
  3. static int n = 999;
  4.  
  5. static void say(){
  6. printf("Hello World!\n");
  7. }

main.c 源码:

 
  1. #include <stdio.h>
  2.  
  3. int n = 100;
  4.  
  5. void say(){
  6. printf("http://c.biancheng.net\n");
  7. }
  8.  
  9. int main(){
  10. say();
  11. printf("n = %d\n", n);
  12. return 0;
  13. }

运行结果:
http://c.biancheng.net
n = 100

我们在 module.c 中定义了变量 n 和函数 say(),它们都被 static 修饰,所以只在 module.c 中有效,在 main.c 中是不可见的。从输出结果也可以看出,main.c 使用了自己的变量和函数,而没有使用 module.c 中的。

使用 static 修饰的变量或函数的作用域仅限于当前模块,对其他模块隐藏,利用这一特性可以在不同的文件中定义同名的变量或函数,而不必担心命名冲突。

static 局部变量

static 除了可以修饰全局变量,还可以修饰局部变量,被 static 修饰的变量统称为静态变量(Static Variable)。

不管是全局变量还是局部变量,只要被 static 修饰,都会存储在全局数据区(全局变量本来就存储在全局数据区,即使不加 static)。

全局数据区的数据在程序启动时就被初始化,一直到程序运行结束才会被操作系统回收内存;对于函数中的静态局部变量,即使函数调用结束,内存也不会销毁。

注意:全局数据区的变量只能被初始化(定义)一次,以后只能改变它的值,不能再被初始化,即使有这样的语句,也无效。

请看下面的代码:

 
  1. #include <stdio.h>
  2.  
  3. int func(){
  4. // 也可以不赋初值 0,静态数据区的变量默认初始化为 0
  5. static int n = 0;
  6. n++;
  7. printf("Function is called %d times.\n", n);
  8. return n;
  9. }
  10.  
  11. int main(){
  12. int i, n = 0;
  13. for(i = 1; i<=5; i++){
  14. func();
  15. }
  16. printf("n = %d\n", n);
  17. return 0;
  18. }

运行结果:
Function is called 1 times.
Function is called 2 times.
Function is called 3 times.
Function is called 4 times.
Function is called 5 times.
n = 0

我们在 func() 中定义了一个静态局部变量 n,它存储在全局数据区,func() 函数执行结束不会被销毁,下次调用继续有效。全局数据区的变量只能初始化一次,第一次调用 func() 时已经对 n 进行了初始化,所以再次调用时就不会重复初始化了,也就是说static int result = 0;语句无效。

静态局部变量虽然存储在全局数据区,但是它的作用域仅限于函数内部,sum() 中的 n 在函数外无效,与 main() 中的 n 不冲突,除了变量名一样,没有任何关系。

总结起来,static 变量主要有两个作用:

1) 隐藏

程序有多个模块时,将全局变量或函数的作用范围限制在当前模块,对其他模块隐藏。

2) 保持变量内容的持久化

将局部变量存储到全局数据区,使它不会随着函数调用结束而被销毁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值