C存储类型

存储方式

变量的作用域(空间)可分为全局变量和局部变量,变量的存储方式可分为动态存储方式和静态存储方式。

从变量值存在的时间(生存期)来观察,有的变量在程序运行的整个过程都是存在的,有的变量则是在调用其所在的函数时才临时分配存储单元。也就是说,变量的存储有两种不同方式:静态存储方式和静态存储方式。

  • 静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式
  • 动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式

在内存中供用户使用的存储空间(用户区)可分为三种:程序区、静态存储区、动态存储区

数据分别存放在静态存储区和动态存储区中,全局变量存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中,数据占据固定的存储单元,而非动态地进行分配和释放。

动态存储区中存放数据

  • 函数形式参数,在调用函数时给形参分配存储空间。
  • 函数中未定义的没有用关键字static声明的变量,即自动变量。
  • 函数调用时的现场保护和返回地址等

存储类别

C语言中,每个变量额函数都有两个属性:数据类型和数据的存储类型,存储类型指的是数据在内存中存储的方式,即静态存储和动态存储。

在定义和声明变量或函数时,应同时指定其数据类型和存储类别,也可采用默认方式指定。

C的存储类别包括4种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。根据变量的存储类别,可知道变量的作用域和生存期。

局部变量的存储类别

  1. 动态局部变量(auto)

函数中的局部变量,若未声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。

函数的形参和在函数中定义的局部变量,都属于此类。在调用函数时,系统会给这些变量分配存储空间,在函数调用结束时,会自动释放掉这些空间。因此这类局部变量称为自动变量。

自动变量用auto做存储类别的声明。

实际上,关键字auto可省略,不写auto则隐含指定为自动存储类别,它属于动态存储方式。程序中大多数变量属于自动变量。

  1. 静态局部变量(static)

若希望函数的局部变量的值在函数调用结束后不消失而继续保留原值,即占用的存储单元不释放,在下次再调用该函数时,该变量已有值。此时应指定该局部变量为“静态局部变量”,使用关键字static进行声明。

注意

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

  • 对静态局部变量是在编译时赋初值,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值,而只是保留上次函数调用结束时的值。而对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行的,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

  • 若在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符('\0‘对字符变量)。而对自动变量而言,其值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新分配单元,而所分配的单元中的内容是不可知的。

  • 虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。因为它是局部变量,只能被本函数引用,而不能被其他函数引用。

你可能感兴趣的:(C存储类型)