Jiahonzheng's Blog

C 存储类

字数统计: 1.2k阅读时长: 3 min
2018/04/07 Share

C 为变量提供了5种不同的存储模型,或称存储类,还有基于指针的第6种存储模型,我们可以从作用域(scope)、链接(linkage)和存储时期(storage duration)来描述存储类。

  • 作用域
    • 描述程序中可以访问一个标识符的一个或多个区域。
    • 一个C变量具有下列作用域之一:代码块作用域、函数原型作用域、文件作用域。
  • 链接
    • 一个C变量具有下列链接之一:外部链接(external linkage)、内部链接(internal linkage)、空链接(no linkage)。
      • 具有代码块作用域或者函数原型作用域的变量有空链接,意味着它们是由其定义所在的代码块作用域或函数原型所私有的。
      • 具有文件作用域的变量可能有内部或外部链接,取决于是否使用了关键字 static 修饰。一个具有外部链接的变量可以在一个多文件程序的任何地方使用;一个具有内部链接的变量可以在一个文件的任何地方使用。
    • 函数也具有链接性:外部链接(默认)、静态(也称内部链接,使用关键字 static )(C99添加了第三种可能性,内联函数)
      • 具有外部链接的函数,可被其他文件中的函数调用。
      • 具有静态链接的函数,只可以在定义它的文件中使用。
  • 存储时期
    • 指变量在内存中保留的时间。
    • 一个C变量具有以下存储时期之一:静态存储时期(static storage duration)、自动存储时期(automatic storage duration)。
      • 具有静态存储时期的变量,在程序执行期间一直存在。
      • 具有自动存储时期的变量,在程序进入定义这些变量的代码块时,将为这些变量分配内存,当退出这个代码块时,分配的内存将被释放。注意,对于具有文件作用域的变量,关键词 static 表示链接类型,并非存储时期。所有具有全局作用域的变量,无论它具有外部链接,还是内部链接,都具有静态存储时期

存储类

存储类 时期 作用域 链接 声明方式
自动 自动 代码块 代码块内
寄存器 自动 代码块 代码块内,使用关键字 register
具有外部链接的静态 静态 文件 外部 所有函数之外
具有内部链接的静态 静态 文件 内部 所有函数之外,使用关键字 static
空链接的静态 静态 代码块 代码块内,使用关键字 static

存储类说明符

C语言中有 5 个作为存储类说明符的关键字,它们是 autoregisterstaticexterntypedef 。关键字 typedef 与内存存储无关,由于语法原因被列入此类。特别地,不可以在一个声明中使用一个以上的存储类说明符,这意味着不能将其他任一存储类说明符作为 typedef 的一部分。

说明符 auto 表明一个变量具有自动存储时期,该说明符只能用在具有代码块作用域的变量声明中,而这样的变量已经拥有自动存储时期,因此它主要用来明确指出意图,使程序更易读。

说明符 register 也只能用于具有代码块作用域的变量。它将一个变量归入寄存器存储类,这相当于请求将该变量存储在一个寄存器内,以更快地存取。它的使用也使我们不能获得变量的地址。

说明符 static 在用于具有代码块作用域的变量的声明时,使该变量具有静态存储时期,从而得以在程序运行期间(即使在包含该变量的代码块并没有运行时)存在并保留其值,变量仍具有代码块作用域和空链接。 static 用于具有文件作用域的变量的声明时,表明该变量具有内部链接。

说明符 extern 表明我们在声明一个已经在别处定义了的变量。如果包含 extern 的声明具有文件作用域,所指向的变量必然具有外部链接。如果包含 extern 的声明具有代码块作用域,所指向的变量可能具有外部链接,也可能具有内部链接,这取决于该变量的定义声明。

原文作者:Jiahonzheng

原文链接:https://blog.jiahonzheng.cn/2018/04/07/C 存储类/

发表日期:April 7th 2018

更新日期:November 26th 2019

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. 存储类
  2. 2. 存储类说明符