C语言 静态变量与自动变量的区别

时间:2021-09-29 00:39:55

       C语言中使用auto 关键字声明自动变量,使用static关键字声明静态变量。

       在函数中定义局部变量时,如果没有被声明为其他类型的变量都是自动变量。在编写代码时,有时需要在调用函数中的某个局部变量以后,这个变量的值不消失,并且保持原值不变,也就是该函数所占用的存储空间不被释放,在下次调用该函数时,变量中的值是上次调用该函数结束时变量的值。这时,使用的变量类型是静态变量,使用static 关键字进行声明。

 

       静态变量与自动变量的区别主要表现在:

Ⅰ )静态存储类型的局部变量是在静态存储区内分配内存单元,在程序的整个运行期间内都不释放空间。而自动类型的局部变量属于动态存储类型,是在动态存储区内分配存储单元的,函数调用结束后存储单元即被释放。


Ⅱ)静态局部变量是在编译时赋初始值,并且只赋一次初值,在以后每次调用函数时,只是使用上一次函数被调用结束时变量的值。而自动局部变量的初值不是在编译时赋予的,而是在函数调用时赋予的,每调用一次函数都会对变量重新赋一次初值。


Ⅲ)如果调用的静态局部变量没有对其进行赋值,则该变量的默认值为0后者为空字符串。而对于自动局部变量来说,如果不赋值,则变量的值是一个不确定的值,这是因为在函数被调用时,会为该变量分配一个存储空间,在函数结束时,存储空间被释放,这两次分配的存储空间是不一样的,存储空间中的值也是不确定的。

          

       程序举例:

#include <stdio.h>
 
void test()
{
    auto a = 0;              //定义自动存储类型变量
    static int b = 3;         //定义静态存储类型变量
    a++;
    b++;
    printf("%d\n", a);        //输出a
    printf("%d\n", b);        //输出b
 
}
int main()
{
    int i;
    for (i = 0; i < 3; i++)
    {
        test();              //调用test函数
    }
    return 0;
}
       该程序执行的结果为: 1 4 1 5 1 6;

       在程序test函数中首先定义了一个自动存储类型变量 a 赋初值 0.定义了一个静态存储类型变量b 赋初值 3;在main 函数中,通过循环3 次调用  test 函数。在第一次调用时,a=0,b=3;执行{a++;b++;} a=1,b=4。第二次调用时,变量a的值为0,b的值为4,因为a 声明为自动变量,函数调用结束后存储空间的值被释放,因此在第二次调用时,使用的是函数的初值,变量b 被声明为静态类型的变量,在第二次调用函数是,使用第一次函数被调用结束时变量的值4,所以执行结果为 a 的值为1,b的值为5,同理,第三次调用时,变量a使用初值0,而变量b 使用的二次调用结束是的值5, 故第三次调用执行结果a 的值为1,b的值为 6。