C语言:变量的作用域和生命周期详解
变量的作用域
变量的作用域指的是变量在程序中可被访问的范围,C 语言中有如下几种作用域:
-
文件作用域(全局作用域):在函数外部声明的变量拥有文件作用域,文件作用域的变量可以被文件中所有函数访问。使用关键字
static
修饰的文件作用域变量只能在当前文件内可见。```
/ 文件 foo.c /
int global_i; // 全局变量,有文件作用域
static char static_j; // 局部静态变量,有文件作用域void func1(){
/ 代码 /
}void func2(){
/ 代码 /
}
``` -
函数作用域(局部作用域):在函数内部声明的变量拥有函数作用域,函数作用域的变量只可在函数内部访问。
```
void foo(){
int local_i; // 局部变量,有函数作用域
static float static_k; // 局部静态变量,有函数作用域/* 代码 */
}
``` -
块作用域:在代码块内部(比如循环、条件语句等块级作用域)声明的变量拥有块作用域,块作用域变量只能在代码块内部访问。
```
void foo(){
for(int i=0; i<10; i++){
int local_i; // 块变量,有块作用域
/ 代码 /
}if(1<2){ int local_j; // 块变量,有块作用域 /* 代码 */ }
}
```
变量的生命周期
变量的生命周期指的是变量的存在时间,C 语言中的变量有以下生命周期:
-
静态存储期:静态存储期的变量使用关键字
static
修饰,在编译时就被分配内存,在程序运行时一直存在,直至程序结束。```
/ 静态存储期变量 /
static int static_var;int main(){
/ 代码 /
return 0;
}
``` -
线程存储期:线程存储期的变量使用关键字
_Thread_local
修饰,每个线程都有一个该变量的独立实例,直至线程结束。```
/ 线程存储期变量 /
_Thread_local int thread_var;int main(){
/ 代码 /
return 0;
}
``` -
自动存储期:自动存储期的变量是在函数内或者代码块内定义的非静态变量,它们在函数或者代码块被调用时创建,在函数或者代码块结束时销毁。
```
void foo(){
/ 自动存储期变量 /
int auto_var;/* 代码 */
}
``` -
动态存储期:动态存储期的变量使用
malloc()
等分配内存的函数动态分配内存,使用free()
等函数释放内存,存在时间由程序员手动控制。```
int main(){
/ 动态存储期变量 /
int dynamic_var = (int )malloc(sizeof(int));/* 代码 */ free(dynamic_var); return 0;
}
```
示例说明
示例 1
#include <stdio.h>
int global_i = 10; // 全局变量
void func(){
int local_i = 5; // 函数作用域变量
printf("local_i = %d\n", local_i);
}
int main(){
/* 代码块作用域 */
for(int i=0; i<2; i++){
int block_i = i; // 块作用域变量
printf("block_i = %d\n", block_i);
}
func();
printf("global_i = %d\n", global_i);
return 0;
}
输出:
block_i = 0
block_i = 1
local_i = 5
global_i = 10
示例 2
#include <stdio.h>
int main(){
/* 静态存储期变量 */
static int static_var = 5;
/* 线程存储期变量 */
_Thread_local int thread_var = 10;
/* 自动存储期变量 */
int auto_var = 20;
/* 动态存储期变量 */
int *dynamic_var = (int *)malloc(sizeof(int));
*dynamic_var = 30;
printf("static_var = %d\n", static_var);
printf("thread_var = %d\n", thread_var);
printf("auto_var = %d\n", auto_var);
printf("*dynamic_var = %d\n", *dynamic_var);
free(dynamic_var);
return 0;
}
输出:
static_var = 5
thread_var = 10
auto_var = 20
*dynamic_var = 30
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言:变量的作用域和生命周期详解 - Python技术站