跳转至

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

约 472 个字 21 行代码 预计阅读时间 3 分钟

存储类别

一个对象具有存储期 一个标识符具有 链接和作用域 描述其可见性

  1. **自动变量**
  2. auto关键字
  3. 不会自动初始化
  4. **寄存器变量**
  5. register关键字
  6. 无法获取地址,因为存储在寄存器而非内存
  7. 操作速度更快
  8. 可声明类型有限,CPU 中的寄存器可能没有足够的存储空间
  9. **块作用域的静态变量**(局部静态变量)
  10. static关键字
  11. 具有块作用域,但是静态存储期

    int f(double m)
    {
        int m;  # 每次运行时都会执行
        static int without = 1;  # 运行时并不执行
    }
    

  12. **外部链接的静态变量**(外部变量)

  13. extern关键字。用于引用已有的外部变量
  14. 外部变量只能初始化一次,而且必须在定义时进行
  15. **内部链接的静态变量**
  16. 用于本文件

基本概念

作用域

Tip : 翻译单元:编译器把源代码文件和其中所有的头文件看成是一个单独的包含信息的文件 全局变量(文件作用域变量)的作用范围是一个翻译单元

链接

外部链接 多文件程序 内部链接 一个翻译单元内 无链接函数原型、 文件作用域 可以是内部/外部链接

int giants = 5;  # 外部链接
static int dodgers = 3;  # 内部链接
int main()
{

}

存储期

  • 分类

静态存储期程序执行期间一直存在 注意,static 并不影响变量存储期,而是影响其链接属性。所有文件作用域变量都具有静态存储期 线程存储期从被声明到线程结束 自动存储期块作用域的变量(局部变量·· 进入块时为变量分配内存,存储期从块开始到块结束 但变长数组的存储期是从定义到块结束 动态分配存储期

内存分配

动态内存分配

stdlib.h

  • malloc函数
  • free函数
    double * positon;
    int n;
    position = (double *) malloc(n * sizeof(double));
    
    if(position == NULL)
    {
        exit(0);
    }
    
    free(position);