普通局部变量和静态局部变量区别

本文通过C语言示例,对比了普通局部变量和静态局部变量的存储位置、生命周期、初始化方式以及运行结果,强调了静态局部变量在程序运行期间的持久性。

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

存储位置

  • 普通局部变量存储在栈上
  • 静态局部变量存储在静态存储区

生命周期

  • 函数执行完毕时, 普通局部变量会被销毁
  • 静态局部变量的生命周期则是整个程序运行期间, 即使函数调用结束, 静态局部变量的值也会被保留

初始化

  • 普通局部变量在每次函数调用时都会被初始化, 他们的初始化是不确定的, 除非显式地进行初始化
  • 静态局部变量在第一次函数调用时会被初始化, 然后保持其值不变, 直到程序结束
#include <stdio.h>

void normal_func() {
    int i = 0;
    i++;
    printf("局部变量 i = %d\n", i);
}

void static_func() {
    static int j = 0;
    j++;
    printf("static局部变量 j = %d\n", j);
}

int main() {
    // 调用3次normal_func()
    normal_func();
    normal_func();
    normal_func();

    // 调用3次static_func()
    static_func();
    static_func();
    static_func();

    return 0;
}

运行结果

局部变量 i = 1
局部变量 i = 1
局部变量 i = 1
static局部变量 j = 1
static局部变量 j = 2
static局部变量 j = 3
### 全局变量、局部变量静态变量的区别及用法 #### 1. 全局变量 全局变量是在函数外部定义的变量,其作用域覆盖整个源文件。一旦定义了全局变量,它在整个程序运行期间都存在,并且可以在任何函数中访问[^4]。 - **存储方式**:全局变量默认是静态存储方式,意味着它的内存分配在程序启动时完成,并在程序结束时释放。 - **作用域**:全局变量的作用域是从定义处到源文件的末尾。如果需要限制其作用域,可以使用`static`关键字将其声明为静态全局变量,此时该变量只能在定义它的源文件内使用[^2]。 示例代码: ```c #include <stdio.h> int globalVar = 10; // 全局变量 void func() { printf("Global variable: %d\n", globalVar); } int main() { func(); return 0; } ``` #### 2. 局部变量 局部变量是在函数或代码块内部定义的变量,其作用域仅限于定义它的代码块。局部变量在进入代码块时分配内存,在退出代码块时释放内存[^4]。 - **存储方式**:局部变量默认是自动存储方式(`auto`),即每次调用函数时都会重新分配内存。 - **作用域**:局部变量的作用域仅限于定义它的函数或代码块。 示例代码: ```c #include <stdio.h> void func() { int localVar = 5; // 局部变量 printf("Local variable: %d\n", localVar); } int main() { func(); return 0; } ``` #### 3. 静态变量 静态变量是一种特殊的变量,可以通过`static`关键字定义。根据定义位置的不同,静态变量分为静态局部变量静态全局变量。 ##### (1) 静态局部变量 静态局部变量是在函数内部定义并使用`static`修饰的变量。与普通局部变量不同,静态局部变量的生存期贯穿整个程序运行期间,但作用域仍然局限于定义它的函数[^3]。 - **存储方式**:静态局部变量的内存分配在程序启动时完成,并在程序结束时释放。 - **初始化**:静态局部变量只会初始化一次,后续调用时保留上次的值。 - **作用域**:静态局部变量的作用域仅限于定义它的函数。 示例代码: ```c #include <stdio.h> void func() { static int staticVar = 0; // 静态局部变量 staticVar++; printf("Static local variable: %d\n", staticVar); } int main() { func(); // 输出 1 func(); // 输出 2 return 0; } ``` ##### (2) 静态全局变量 静态全局变量是通过`static`关键字定义的全局变量。与普通全局变量不同,静态全局变量的作用域被限制在定义它的源文件内,无法被其他源文件访问[^2]。 - **存储方式**:静态全局变量的存储方式与普通全局变量相同,都是静态存储。 - **作用域**:静态全局变量的作用域仅限于定义它的源文件。 示例代码: ```c // 文件1.c static int staticGlobalVar = 10; // 静态全局变量 void printStaticGlobal() { printf("Static global variable: %d\n", staticGlobalVar); } // 文件2.c // 尝试访问 staticGlobalVar 将导致编译错误 ``` ### 总结 - **全局变量**:作用域覆盖整个源文件,生存期贯穿整个程序运行期间。 - **局部变量**:作用域仅限于定义它的代码块,生存期从进入代码块开始到退出代码块结束。 - **静态变量**:包括静态局部变量静态全局变量,具有不同的作用域生存期特性。静态局部变量的作用域限于定义它的函数,而静态全局变量的作用域限于定义它的源文件。 ### 注意事项 - 使用全局变量时需谨慎,因为它可能导致意外的副作用,尤其是在复杂的程序中。 - 静态局部变量适合用于需要在多次函数调用之间保留值的场景,而静态全局变量则适合用于限制变量的作用域以避免命名冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值