C语言中的存储类别,作用域和生存周期

介绍

变量和函数都有两个属性:数据类型和存储类别,存储类别的不同则它们的作用域和生存期均有所差别

四种存储方式

auto

一般定义的变量没有直接默认为auto类型,函数执行时分配空间,函数结束时自动释放。

static

定义的变量在函数结束后不释放,对静态局部变量在编译时只赋值一次,第二次执行赋值语句时不再重新赋值,但是其他函数也无法使用该静态变量。编译时将变量分配在静态存储区。

extern

声明外部变量,外部变量即全局变量,它的作用域是从变量的定义出开始,到程序文件的结尾。编译时将变量分配在静态存储区。

register

如果有一些变量使用频繁,则每次存取变量的值需要花费很长一段时间,为提高执行效率,C语言允许将局部变量的值直接放在CPU的寄存器中.

作用域

局部变量

  1. 自动变量,动态局部变量,函数结束时变量将会被释放
  2. 静态局部变量,函数结束时变量被保存
  3. 寄存器变量,函数结束时变量将会被释放
  4. 形参可以定义为自动变量或寄存器变量

全局变量

  1. 静态外部变量,只能在本文件中使用
  2. 非静态外部变量,允许其他文件使用

生存期

动态存储

  1. 自动变量(在函数内有效)
  2. 寄存器变量(在函数内有效)
  3. 形参(在函数内有效)

静态存储

  1. 静态局部变量(在函数内有效)
  2. 静态外部变量(在文内有效)
  3. 外部变量(其他文件也可使用)