C语言-变量的存储类型

了解变量的存储类型

变量的存储类型决定了变量什么时候被分配到指定的内存空间中,以及什么时候释放存储空间。因此,存储类型就是为变量分配使用内存空间的方式,也可以称为存储方式。变量的存储方式分为两种,即动态存储和静态存储

要理解动态存储和静态存储方式,首先要了解一下内存中用户存储空间的基本情况,系统提供给用户的存储空间可以分为3个部分,即程序区、静态存储区、动态存储区。


其中程序区用来存放用户要执行的程序段,数据分别放在静态上存储区和动态存储区。

静态存储区的变量位于内存的静态存储区,全局变量都保持在静态存储区中,因此,全局变量从程序执行时开始分配存储单元,知道程序终止,才释放其所占的存储空间。

在动态存储区中存储与堆栈操作相关的数据,堆栈中的数据随着进栈和出栈操作而变化,当变量被弹出堆栈以后,其生存周期也就结束了。在调用函数时,其局部变量也被保存到动态存储区中,当函数结束执行,返回主调函数时,变量所占的空间将被释放,此时局部变量也将消失。由此可知,如果一个函数被调用了两次,其中变量的存储空间可能为不同的地址。

各存储空间存储的数据内容

静态存储区

存储全局变量。在程序执行的过程中,全局变量占据固定的内存空间,直到程序执行完毕才释放内存。

动态存储区

自动变量。在函数调用时分配存储空间,调用完成之后释放存储空间。

函数形参,只有在调用该函数时才能为形参分配存储空间,调用完成以后会将所有空间释放掉。

使用auto关键字声明自动变量

自动变量的类型声明符为auto,这是C语言中应用最广泛的一种类型。在函数中定义局部变量时,如果没有被声明为其他类型,则该变量即为自动变量。

void test(int a)  // 定义函数test,变量a为形参
{
    auto int x,y=5; // 定义自动变量x和y
    // ...
}

上面的代码中定义了一个名为test的函数,变量a为形参,x和y为自动类型的变量并且给y赋值为5.当执行完test函数,会将变量a,x,y所占用的存储单元释放。在实际的开发中,关键字auto是可以省略的,因为默认就是auto类型。注意:自动变量属于局部变量,其作用域仅限于这个变量的函数内。自动变量的存储方式属于动态存储,所以当定义该变量的函数被调用以后系统才会给它分配存储空间,此时生命周期开始,函数调用结束,将释放存储单元,生命周期结束。

使用static关键字声明静态变量

在实际的开发中,有时候需要在调用函数中的某个局部变量以后,该变量的值不消失,并且保存原值不变,也就是该变量所占用的存储空间不释放,在下次调用该函数时,变量中的值仍然是上次调用该函数结束时变量的值。这时候使用的变量类型是静态变量,使用static关键字进行声明。静态变量属于静态存储方式。

定义变量时,使用static关键字就可以将其定义为静态变量,格式如下:

static 类型声明符 变量1,变量2,...

使用static关键字声明外部变量,会得到静态全局变量(静态外部变量)。当定义内部变量时,会得到静态局部变量(静态内部变量)。

void test()
{
    auto int a=0;
    static int b=3;
    a++;
    b++;
    printf("%d\n",a);
    printf("%d\n",b);
}

int main(int argc, const char * argv[]) {
    for (int i=0; i<3; i++) {
        test();
    }
    return 0;
}

输出结果:

1

4

1

5

1

6


代码可知,test函数调用了3次,每次都会输出变量a,b的值。因为a是自动变量,所以在函数调用结束之后存储空间会被释放掉,因而后续调用变量a还是初始值。变量b被定义为静态变量,所以其存储空间不会被释放,其值也会在调用之后保持不变,因此下一次调用时,变量b的值就是上一次调用结束时候的值。

注意:虽然静态局部变量的值在函数调用结束以后也是保持不变的,但是它不能被其它的函数所引用,只能在所在的函数中使用。

静态变量与自动变量的区别

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

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

3)如果没有对定义的静态局部变量进行赋值,则该变量的默认值是0或者空字符串。对于自动变量来说,如果没有赋值,则变量的值是不确定的值。



猜你喜欢

转载自blog.csdn.net/longshihua/article/details/79674663