C语言高阶知识之static的作用

admin 2024年2月14日01:03:56评论10 views字数 1177阅读3分55秒阅读模式

(1) 隐藏

当我们同时编译多个文件时,所有未加 static 前缀的全局变量和函数都具有全局可见性。

char a = 'A'; // global variablevoid msg() {    printf("Hellon"); }
int main(void){        extern char a;    // extern variable must be declared before use    printf("%c ", a);    (void)msg();    return 0;    }

程序的运行结果是:

A Hello


前面说过,所有未加 static 前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a 是全局变量,msg 是函数,并且都没有加 static 前缀,因此对于另外的源文件 main.c 是可见的。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static 可以用作函数和变量的前缀,对于函数来讲,static 的作用仅限于隐藏,而对于变量,static 还有下面两个作用。

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

#include <stdio.h>int test() {    static int a = 0; // 事实上此赋值语句从来没有执行过    return a++;}int main(int argc, char const* argv[]) {    printf("%dn", test());    printf("%dn", test());    printf("%dn", test());    printf("%dn", test());    return 0;}

程序的运行结果是:

0123

上述变量a在程序运行结束之前始终随着所在函数的被调用和退出而存在和消失。

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。

共有两种变量存储在静态存储区:全局变量和 static 变量。

(3)static 的第三个作用是默认初始化为 0

#include <stdio.h>
int a;
int main(void) { static int b; int c; static char str[10]; str[0] = 's'; str[1] = 'w'; printf("%d %d %dn", a, b, c); printf("%s", str); return 0;}

程序的运行结果是:

0 0 0sw

在这里c没有初始化,得到的值可能是随机的,也应具体的编译器环境而定,建议将其显式地初始化。在静态数据区,内存中所有的字节默认值都是 0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置 0,然后把不是 0 的几个元素赋值。如果定义成静态的,就省去了一开始置 0 的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加 太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是



原文始发于微信公众号(中学生CTF):C语言高阶知识之static的作用

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月14日01:03:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   C语言高阶知识之static的作用http://cn-sec.com/archives/2206227.html

发表评论

匿名网友 填写信息