C语言中static的主要作用

在C语言中,static 关键字用于函数内部的变量定义有几个主要作用:

  1. 局部变量的生命周期延长:通常情况下,函数中的局部变量(如自动变量)仅在函数执行期间存在。但是,当局部变量被声明为 static 时,它的生命周期延长至程序运行期间。这意味着,即使函数执行完成,该变量的值也不会丢失,下次当该函数再次被调用时,该变量将保持上次执行结束时的值。
  2. 限制作用域:虽然 static 局部变量的生命周期为整个程序运行期间,但其作用域仍限制在声明它的函数内。这意味着它只能在这个特定的函数内被访问和修改。
  3. 默认初始化为零:如果没有显式初始化,静态局部变量会自动初始化为零(对于指针变量,会被初始化为 NULL)。

举个例子,定义 static uint8_t temp=0u; ,这意味着 temp 是一个只在声明它的函数内可见的变量,且其值在函数调用之间会保持不变。这里它被显式初始化为 0u(即0,u 表示无符号类型),但即使没有这个初始化,它也会默认为零。这种做法常用于需要保持状态或计数的场合,例如在函数被多次调用时跟踪特定事件的发生次数。

Talk is cheap, show the code. 当然,这里我用一个简单的示例,展示了 static 关键字在C语言中的用法,特别是在函数内部定义静态变量的情况。

这个例子中,我将创建一个函数,该函数包含一个 static 变量用于跟踪该函数被调用的次数。每次调用这个函数时,这个计数器都会增加,展示了 static 变量在函数调用之间是如何保持其值的。

#include <stdio.h>

void CounterFunction() {
    // 定义一个static变量
    static int count = 0;

    // 每次调用此函数时增加计数器
    count++;

    // 打印当前的计数值
    printf("Function has been called %d times\\n", count);
}

int main() {
    // 调用函数三次
    CounterFunction(); // 输出: Function has been called 1 times
    CounterFunction(); // 输出: Function has been called 2 times
    CounterFunction(); // 输出: Function has been called 3 times

    return 0;
}

在这个例子中:

  • CounterFunction 函数中定义了一个 static 整型变量 count。由于它是静态的,它的值在函数调用之间会保持不变。
  • 每次调用 CounterFunction 时,count 的值都会增加 1。
  • 函数会打印出它被调用的次数。

即使函数执行完毕后,count 变量的值也不会丢失,而是在下一次函数调用时继续从上次的值开始计数。这是 static 变量的一个典型用途,用于跟踪函数被调用的次数或保持其他类型的状态信息。


如果在上面的函数中去掉 static 关键字,count 变量将成为一个普通的局部变量。这意味着它将在每次调用 CounterFunction 函数时被重新初始化为其声明时的值。在这个例子中,它将在每次函数调用开始时都被初始化为0。

下面是修改后的代码,其中 count 不再是 static

#include <stdio.h>

void CounterFunction() {
    // 定义一个非static局部变量
    int count = 0;

    // 每次调用此函数时尝试增加计数器
    count++;

    // 打印当前的计数值
    printf("Function has been called %d times\\n", count);
}

int main() {
    // 调用函数三次
    CounterFunction(); // 每次输出: Function has been called 1 times
    CounterFunction(); // 每次输出: Function has been called 1 times
    CounterFunction(); // 每次输出: Function has been called 1 times

    return 0;
}

在这种情况下,每次调用 CounterFunction 时,输出都将是 “Function has been called 1 times”。这是因为每次函数被调用时,count 都从0开始,并且增加1,然后函数结束时 count 就被销毁了。在下一次函数调用时,count 重新开始于0,而不是上一次调用结束时的值。

这个行为展示了非静态局部变量(即自动变量)的典型特性:它们在每次函数调用时都会重新初始化,并且在函数调用结束时失去它们的值。

那么static 定义的局部变量是否和全局变量一样拥有固定内存地址?
是的,static 定义的局部变量在某种程度上类似于全局变量,特别是在它们拥有固定内存地址这一点上。不过,它们与全局变量在作用域和可见性方面有重要的区别。以下是这两种类型变量的比较:

static 局部变量

  1. 固定内存地址:当你在函数内部使用 static 关键字声明一个变量时,这个变量会被分配一个固定的内存地址。这个地址在程序的整个运行期间都不会改变。
  2. 作用域限制:虽然 static 局部变量在整个程序运行期间都存在,但它们的作用域限制在声明它们的函数内。这意味着你只能在这个特定的函数内访问这个 static 变量。
  3. 默认初始化为零:如果未显式初始化,静态局部变量会被自动初始化为零(对于非数值类型,如指针,会被初始化为 NULL)。

全局变量

  1. 固定内存地址:全局变量也会在程序的内存中被分配一个固定的地址,在程序的整个运行期间该地址保持不变。
  2. 全局作用域:全局变量可以在整个程序中的任何地方被访问,只要你在需要访问它的文件中正确地声明(或包含)它。
  3. 默认初始化为零:与静态局部变量类似,全局变量如果未显式初始化,也会自动初始化为零。

因此,尽管 static 局部变量和全局变量在存储持久性和内存地址固定性方面相似,但它们在作用域和可见性上有本质的不同。static 局部变量提供了一种在单个函数内保持状态的方式,而全局变量允许在程序的不同部分之间共享数据。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值