存储类说明符
来自 cppreference.com
auto
- 自动持续时间,无链接。register
- 自动持续时间,无链接。也暗示编译器将变量放在处理器的寄存器中。static
- 静态持续时间,在文件作用域内具有内部链接,在块作用域内无链接。extern
- 静态持续时间,具有内部或更通常的外部链接。_Thread_local
- (自 C11 起) - 线程存储持续时间。
目录 |
[编辑] 解释
[编辑] 存储持续时间
程序中的所有变量都具有以下存储持续时间之一,它决定其生存期
- 自动 存储持续时间。变量在封闭代码块开始时分配,并在结束时释放。这是所有变量的默认值,除了那些声明为
static
、extern
或_Thread_local
的变量。
- 自动 存储持续时间。变量在封闭代码块开始时分配,并在结束时释放。这是所有变量的默认值,除了那些声明为
- 静态 存储持续时间。变量在程序开始时分配,并在程序结束时释放。只能存在一个变量实例。使用
static
或extern
声明的变量具有此存储持续时间。
- 静态 存储持续时间。变量在程序开始时分配,并在程序结束时释放。只能存在一个变量实例。使用
- 线程 存储持续时间 (自 C11 起)。变量在线程开始时分配,并在线程结束时释放。每个线程都有自己的变量实例。只有声明为
_Thread_local
的变量具有此存储持续时间。_Thread_local
只能用于声明为static
或extern
的变量,不能用于函数声明。
- 线程 存储持续时间 (自 C11 起)。变量在线程开始时分配,并在线程结束时释放。每个线程都有自己的变量实例。只有声明为
- 分配 存储持续时间。变量使用 动态内存分配 函数按请求分配和释放。
[编辑] 链接
链接是指变量或函数在其他作用域中被引用的能力。如果具有相同标识符的变量或函数在多个作用域中声明,但不能从所有作用域中引用,则会生成该变量的多个实例。以下链接得到识别
- 无链接。该变量只能从其所在的范围(块范围)中引用。所有具有自动、线程和动态存储持续时间的变量以及在块作用域内声明为
static
的变量都具有此链接。
- 无链接。该变量只能从其所在的范围(块范围)中引用。所有具有自动、线程和动态存储持续时间的变量以及在块作用域内声明为
- 内部链接。该变量可以从当前翻译单元中的所有作用域引用。所有在文件作用域中声明的变量,包括在文件作用域中声明为
static
的变量,都具有此链接。
- 内部链接。该变量可以从当前翻译单元中的所有作用域引用。所有在文件作用域中声明的变量,包括在文件作用域中声明为
- 外部链接。该变量可以从整个程序中的任何其他翻译单元中引用。所有声明为
extern
或const
且没有显式存储类说明符但不是static
的变量都具有此链接。
- 外部链接。该变量可以从整个程序中的任何其他翻译单元中引用。所有声明为
[编辑] 关键字
auto,register,static,extern,_Thread_local
[编辑] 示例
作用域、可见性、生命周期:具有自动存储持续时间的变量分配具有较高的内存地址。具有静态存储持续时间的变量分配具有较低的内存地址;未初始化的变量在内存中与已初始化的变量分开,以便快速内部初始化为零。具有分配存储持续时间的变量分配的内存高于具有静态存储持续时间的变量。
运行此代码
#include <stdio.h> #include <stdlib.h> /* static storage duration */ int A; // uninitialized global variable; this system initializes with zero int B = 9; // initialized global variable int main(void) { printf("&A = %p\n", (void*)&A); printf("&B = %p\n", (void*)&B); /* automatic storage duration */ int A = 1; // hides global A printf("&A = %p\n", (void*)&A); /* static storage duration */ static int B=1; // hides global B printf("&B = %p\n", (void*)&B); /* allocated storage duration */ int *ptr_1 = (int*)malloc(sizeof(int)); /* start allocated storage duration */ printf("address of int in allocated memory = %p\n", (void*)ptr_1); free(ptr_1); /* stop allocated storage duration */ return 0; }
可能的输出
&A = 0x60103c &B = 0x601034 &A = 0x7fff3c3153fc &B = 0x601030 address of int in allocated memory = 0xc4f010