C语言存储类别

与变量存储类别相关的C语言关键字

关键字:auto extern static register _Thread_local

如何区别变量的存储类别

 内存用于储存内存中的数据,数据的存储类别取决于它的存储期,作用域和链接。

 存储期可以是静态的,自动的或动态分配的。如果是静态存储期,在程序开始执行时分配内存,并在程序运行时都存在。如果是自动存储期,在程序进入变量定义所在的块时分配内存,在离开块时释放内存。如果是动态分配存储期,在调用malloc()(或相关函数)时分配内存,在调用free()时释放内存。

 作用域决定程序的那些部分可以访问某数据。定义在所有函数在之外的变量具有文件作用域,对位于该变量声明之后的所有函数可见,定义在块或作为函数形参内的变量具有块作用域,只对块以及它包含的嵌套块可见。

 链接描述定义在程序某翻译单元中的变量可被链接的程度。具有块作用域的变量是局部变量,无链接。具有文件作用域的变量可以是内部链接或者是外部链接。内部链接意味着只有其定义所在的文件才能使用该变量,外部链接意味着其他文件也可以使用该变量。

变量存储类别

 下面是C语言中变量可能的存储类别,包括线程概念。

存储类别 存储期 作用域 链接 声明方式
自动 自动 在块中不带存储类别说明符或带auto存储类别说明符声明的变量(或作为函数头中的形参)。如果未初始化,它的值是未定的。
寄存器 自动 在块中带register存储类别说明符声明的变量。如果未初始化,他的值是未定的。
静态,无链接 静态 在块中带static存储类别说明符声明的变量。如果未初始化,字节都被设置为0。
静态,外部链接 静态 文件 外部 在所有函数外部且没有使用staatic存储类别说明符声明的变量。如果未初始化,字节都被设置为0。
静态,内部链接 静态 文件 内部 在所有函数外且使用存储类别说明符static声明的变量。如果未初始化,字节被设置为0。
线程,外部链接 线程 文件 外部 在所有块的外部,使用关键字_Thread_local。如果未初始化,字节被设置为0。
线程,内部链接 线程 文件 内部 在所有块的外部,使用关键字static和_Thread_local。如果未初始化,字节被设置为0。
线程,无链接 线程 在块中,使用关键字static和_Thread_local。如果未初始化,字节被设置为0。

注意:关键字extern只能用来再次声明在别处已经定义过的变量。在函数外部定义变量,该变量具有外部链接属性。