C语言的存储类别
关键字
auto、extern、static、register、_Thread_local (C11)
一般注解
变量的存储类别取决于它的作用域、链接和存储器。存储类别由声明变量的位置和与之关联的关键字决定。定义在所有函数外部的便来那个具有文件作用域、外部链接、静态存储器。声明在函数中的变量是自动变量,付费该变量前面使用了其他关键字。它们具有块作用域、无链接、自动存储期。以static关键字声明在函数中的变量具有块作用域、无链接、静态存储期。以static关键字声明在函数外部的变量具有文件作用域、内部链接、静态存储期。
C11新增了一个存储说明符:_Thread_local。以该关键字声明的对象具有线程存储期,意思是在线程中声明的对象在该线程运行期间一直存在,且在线程开始时被初始化。因此,这种对象属于线程私有。
属性
下面表格总结了这些存储类别的属性:
存储类别 | 存储期 | 作用域 | 链接 | 如何声明 |
---|---|---|---|---|
自动 | 自动 | 块 | 无 | 在块中 |
寄存器 | 自动 | 块 | 无 | 在块中,用关键字register |
静态、外部链接 | 静态 | 文件 | 外部 | 在所有函数外部 |
静态、内部链接 | 静态 | 文件 | 内部 | 在所有函数外部,使用关键字static |
静态、无链接 | 静态 | 块 | 无 | 在块中,使用关键字static |
线程、外部链接 | 线程 | 文件 | 外部 | 在所有块外部,使用关键字_Thread_local |
线程、内部链接 | 线程 | 文件 | 内部 | 在所有块的外部,使用关键字static和_Thread_local |
线程、无链接 | 线程 | 块 | 无 | 在快中,使用关键字static和_Thread_local |
注意,关键字extern只能用来再次声明在别处已定义过的变量。在函数外部定义变量,该变量具有外部链接属性。
出了以上介绍的存储类别,C语言还提供了动态分配内存。这种内存通过调用malloc()函数系列中的一个函数来分配。这种函数返回一个用于访问内存的指针。调用free()函数或者结束程序可以释放动态分配的内存。任何可以访问指向该内存指针的函数均可以访问这块内存。例如,一个函数可以 把这个指针的值返回给另一个函数,那么另一个函数也可以访问该指针指向的内存。
参考资料:
史蒂芬・普拉达. C Primer Plus (第6版) 中文版[M]. 人民邮电出版社, 2016.