作用域,链接,存储期关系综合分析
内存用于存储程序中的数据,可以通过存储期,作用域和链接来对其进行表征。
1.存储期
存储期可以是静态的,自动的 或者是 动态分配 的
①如果是静态存储期,程序开始执行时分配内存,程序运行期间一直存在,程序结束后释放。
②自动,在程序进入变量所在的块定义时分配,块结束时释放。
③动态存储期,在调用malloc时(或相关函数)分配内存,调用free函数时释放内存。
2.作用域
作用域决定对于某个数据,程序的哪些部分可以访问它。
①定义在所有函数之外的变量具有文件作用域,对该变量声明后面部分的所有函数可见。
②定义在块内或作为函数形参的变量具有块作用域,只对该块和它所包含的嵌套块可见。
3.链接属性
链接描述了定义在程序某翻译单元(见博客翻译单元)中的变量可被链接的程度。
①具有块作用域的变量是局部变量,无链接。
②具有文件作用域的变量可以使内部链接,也可以是外部链接。
内部链接意味着只有定义它的文件才能使用该变量,外部链接意味着其他文件进行声明引用后也可以使用该变量。
存储类别总结
存储类别主要包括自动,寄存器,静态无链接,静态内部链接,静态外部链接。
①自动—在块中不带存储类别说明符或者带auto存储类别说明符的变量(或作为函数头中的形参)属于自动存储类别,具有 自动存储期,块作用域,无链接。
如果未初始化自动变量,它的值是未定义的,即垃圾值。
②寄存器—在块中带register存储类别说明符声明的变量(或作为函数头中的形参)属于寄存器存储类别,具有自动存储期、块作用域、无链接,且无法获取其地址。
把一个变量声明为寄存器变量即请求编译器将其存储到访问速度最快的区域。
如果未初始化寄存器变量,它的值是未定义的。
③静态、无链接—在块中带static存储类别说明符声明的变量属于“静态、无链接”存储类别,具有静态存储期、块作用域、无链接。
只在编译时被初始化一次。
如果未显式初始化,它的字节都被设置为0。
④静态、外部链接—在所有函数外部且没有使用static存储类别说明符声明的变量属于“静态、外部链接”存储类别,具有静态存储期、文件作用域、外部链接。
只能在编译时被初始化一次。
如果未显式初始化,它的字节都被设置为0。
⑤静态、内部链接—在所有函数外部且使用了static存储类别说明符声明的变量属于“静态、内部链接”存储类别,具有静态存储期、文件作用域、内部链接。
只能在编译器被初始化一次。
如果未显式初始化,它的字节都被设置为0。