Mobile wallpaper 1Mobile wallpaper 2Mobile wallpaper 3Mobile wallpaper 4Mobile wallpaper 5Mobile wallpaper 6Mobile wallpaper 7Mobile wallpaper 8
1055 字
5 分钟
【C语言】变量的作用域,生命周期和存储空间
2025-12-13
2025-12-13
C

目录#

画师:竹取工坊

有帮助的话可以到主页:Mem0rin给主包点一个小小的关注~

欢迎关注互三,一起交流进步!

目录

一、作用域

二、生命周期

三、存储区域

staic修饰局部变量

static修饰全局变量

static修饰全局函数


一、作用域#

这是一个程序设计概念,指的是限定变量名的可用性的代码范围。

在此基础上,变量分为两种:全局变量和局部变量

全局变量的作用域是整个代码文档,

局部变量的作用域是变量所在的局部区域。

比如在代码内

#include<stdio.h>
int m = 10;
int mul(int y) {
return y * y;
}
int square(int x) {
return mul(x) + m;
}
int main() {
int a = m;
scanf("%d", &a);
if (a > 10) {
int b = square(a);
printf("%d", b);
}
return 0;
}

b的作用域是if语句的大括号内的区域,a的作用域是main函数的大括号内,x和y的作用域分别是square和mul函数的大括号内部,m的作用域是整个代码。

可以发现,a是可以进入if语句的大括号内部的,但是反之不行,如果在if语句外部使用变量b就会报错。

全局变量m可以到main可以到square可以到mul。

如果在工程中要跨文件访问全局变量,可以使用extern声明一个定义在别处的**全局变量。**从其他的代码文件中提取全局变量使用

此外extern还可以声明全局函数。

二、生命周期#

指的是变量从创建到销毁的过程

全局变量的生命周期是整个程序,

局部变量的生命周期是所在的作用域中变量创建到出作用域的过程。

三、存储区域#

**变量的生命周期是由变量的存储区域决定的。**因此我们现在将考察变量的存储区域及其对应的生命周期。可以列出下表:

存储区域常见变量生命周期
栈(stack)普通局部变量、函数形参自动存储期
堆(heap)malloc / calloc动态存储期
静态区 / 全局区全局变量、static 变量静态存储期
常量区字符串字面量静态存储期
代码区函数代码程序全程

在栈和堆的变量,在离开作用域之后就会自动销毁,我们平时在函数中定义的局部变量,函数形参都是这样。全局变量储存在静态区,程序没有结束就不会销毁。

staic修饰局部变量#

那么如果我们不想让局部变量销毁,而是不断地进行累加呢?从表格可以得知,我们可以用static进行修饰。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void add(int x) {
static a = 2;
a++;
printf("%d ", a);
}
int main() {
int a = 1;
printf("%d ", a);
add(a);
printf("%d ", a);
add(a);
printf("%d ", a);
add(a);
printf("%d ", a);
return 0;
}
>>>1 3 1 4 1 5 1

如果把static去掉就是1 3 1 3 1 3 1了,可以发现add函数中的a并没有被销毁然后从头开始,而是在不断累加的。但是和全局变量不同的是,它的作用域依旧是add函数内部,static只是把变量的存储区域进行转移,从而改变了它的生命周期。

static修饰全局变量#

static也可以修饰全局变量。还记得extern可以从外部文件中调用全局变量吗,static的作用就是让全局变量不会被extern拿去使用,从而只能在该文件内使用。

本质上是因为全局变量自身是有外部链接属性的,被static声明之后就变成内部链接属性,只能在该源文件内部使用。

static修饰全局函数#

和修饰全局变量同理,会把全局函数的外部链接属性改成内部链接属性,只能在这个源文件内部使用。

【C语言】变量的作用域,生命周期和存储空间
https://blog.csdn.net/2501_93882415/article/details/155891008
作者
Mem0rin
发布于
2025-12-13
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时