内存
适用于存储程序中数据,由存储期、作用域和链接表征。存储期可以是静态、自动或者 动态分配的,若为静态存储,则在程序开始执行时分配内存,程序离开块时释放内存,若为动态分配,在调用malloc()或者是相关函数时分配内存,在调用free()时候释放内存。
作用域
决定了程序的哪些部分可以访问数据,定义在所有函数之外的变量具有文件作用域,对位于该变量声明之后的所有函数均可见,定义在块或者作为函数形参内的变量具有块作用域,其只能是局部变量,没有链接。
链接
描述定义为程序某翻译单元中的变量可按链接的程度。具有块作用域的变量是局部变量,没有链接;具有文件作用域的变量可以是内部链接或者外部链接。内部链接意味着只有定义其所在文件才能使用。
以下为C的5种存储类别,不含线程概念:
-
自动——在块中不带存储类别说明符号或者带auto存储类别说明符声明变量(或者作为函数头中的形参)属于自动存储类别,具有自动存储期、块作用域、无链接。若未初始化自动变量,它的数值是未定义的。
-
寄存器——在块中带register存储类别说明符声明的变量(或者作为函数头中的形参)属于寄存器存储类别,具有自动存储期、块作用域、无链接,且无法获取其地址。把一个变量声明为寄存器变量即请求编译器将其存储到访问速度最快的区域,若未显示初始化寄存器变量,它的数值未定义。
-
静态、无链接——在块中带static存储类别说明符声明的变量属于”静态、无链接“存储类别,具有静态存储期、块作用域、无链接。只有编译时被初始化一次,若未显示初始化,它的字节都被设置为0。
-
静态、外部链接——在所有函数外部且没有使用static存储类别说明符声明的变量属于”静态、外部链接“存储类别,具有静态存储期、文件作用域、外部链接。只能在编译器被初始化一次,如果未显式初始化,它的字节都被设置为0。
-
静态、内部链接——在所有函数外部且使用了static存储类别说明符声明的变量属于”静态、内部链接“存储类别,具有静态存储期、文件作用域、内部链接。只能在编译器被初始化一次,若未显示初始化,则其字节都被设置为0。
-
动态内存的分配由malloc决定,函数返回一个指向指定字节数内存块的指针,这块内存被free函数释放后便可以重复利用,free函数用该内存块的地址作为参数。