储存类别、链接和内存管理

一、储存类别

  • 对象:具有一定大小空间的一块内存。
  • 标识符:用来指定特定对象的内容。
  1. 作用域
    • 描述了程序中可访问标识符的区域。
    • 分类:
      • 块作用域
      • 函数作用域
      • 文件作用域
      • 函数原型作用域:从形参定义处到原型声明结束。
    • 全局变量:也称为文件作用域变量。
  2. 链接
    • C变量的三种链接属性:
      • 外部链接:该类型变量可以在多文件程序中使用
      • 内部链接:该类型变量只能在一个翻译单元中使用
      • 无链接:具有块作用域、函数作用域或函数原型作用域的变量
    • 储存类别说明符static
  3. 存储期:
    • C对象有4种
      • 静态存储期:在程序的执行期间一直存在,文件作用域变量都具有静态存储期。
      • 线性存储期:用于并发程序设计。
      • 自动存储期:所有局部变量都有该性质,在函数调用时被创建,离开函数时被销毁。
      • 动态分配存储期:
  4. 自动变量
    • 属于自动存储类别,有自动存储期、块作用域、无链接。
    • 可显式使用关键词auto
    • 块作用域和无链接意味着只有在变量定义的块中才能通过变量名访问该变量。
  5. 寄存器变量
    • 特殊的自动变量。也是自动存储期、块作用域、无链接。
    • 可以显式使用关键词register,是一种请求,编译器可能会拒绝你的请求,此时就变成了普通变量,但仍然无法访问该变量的内存。
    • 作用是储存在最快的可用内存中,能够以更快的速度访问。
    • 存储在寄存器中而非内存中,所以无法获取寄存器变量的地址。
  6. 块作用域的静态变量
    • 静态指的是在内存中原地不动,但它的值可以改变。
    • 具有块作用域、无链接、有静态存储期。
    • 在块中static(提供静态存储期)声明这种变量。
    • 如果未显式地初始化静态变量,它们会被初始化为0
  7. 外部链接的静态变量
    • 具有文件作用域、外部链接、静态存储期。
    • 有时又称为外部存储类型、该类别地变量被称为外部变量
    • 创建过程:在所有函数外面(定义性声明)创建这个外部变量。
    • 函数使用该变量时,为了指出使用的是外部变量,可以用关键字extern再次声明。
    • 如果一个源文件使用的外部变量定义在其他文件中,则必须用extern在该文件中声明该变量。
    • 定义式声明、引用式声明。
  8. 内部链接的静态变量
    • 具有静态存储期、文件作用域、内部链接。
    • 所有函数外部,用存储类别说明符static定义该类变量。
    • 该类型变量只能用于同一个文件中的函数
    • 可以在函数中使用类别说明符extern重复声明该类型变量,这并不会改变其链接属性。
  9. 多文件(多翻译单元)
    • 程序在多个翻译单元中才能体现区别内部和外部变量的重要性。
  10. 存储类别的选择
    • 正常情况下多使用自动存储类别,使用外部变量可能在不经意中修改变量的值,count类型变量除外。

二、

Author: Eternity
Link: http://yoursite.com/2019/10/18/%E5%82%A8%E5%AD%98%E7%B1%BB%E5%88%AB%E3%80%81%E9%93%BE%E6%8E%A5%E5%92%8C%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.