【c语言】全局变量 | 局部变量的生命周期与作用域

文章详细介绍了C语言中的全局变量和局部变量的生命周期及存储区域,强调了重名时的临近原则,并解释了extern如何用于外部变量的声明,提醒读者extern声明并不定义变量,应避免重复定义导致的错误。

创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 

主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

c语言系列专栏: c语言之路重点知识整合  

 

目录

一、 全局变量

二、局部变量

三、重名:临近原则 

四、extern外部变量的声明

总结 


一、 全局变量

全局变量的生命周期长,从程序启动到程序关闭

在主函数外定义int类型i,i为全局变量,存放在全局/静态区,未初始化默认是0。

 

 

 二、局部变量

局部变量生命周期较短,在函数调用时局部变量在栈区,函数执行完在栈区被回收

也可以是if switch for while的作用范围、复合的多条语句构成的语句块,在{ }内部。

调用函数时创建,函数执行完回收:

 

三、重名:临近原则 

当全局变量和局部变量同时存在定义,调用时需要根据 临近原则:离哪个变量近哪个起作用

#include <stdio.h>
int i;
void fun();
int main()
{
	printf("%d\n",i);
	fun();
	printf("%d\n",i);
	fun();
	return 0;
}
void fun()
{
	int i=10;
	i++;
	printf("%d\n",i);  //输出结果为11  i取局部变量的i
}

四、extern外部变量的声明

所谓外部变量即在另外的源代码文件中定义的全局变量。如果当前的源代码文件要访问时;就需要用extern 声明一下,即告诉编译器,我目前用的变量是本代码文件以外定义的。

用extern仅仅是声明告知一下,并不是定义。同样在使用extern声明时不能赋予初始值,否则时重定义错误。声明不等于定义!! 定义是定义新的变量,声明是告知变量。 

外部链接声明:在同一项目下其他的源文件中定义了变量。另一个源文件就可以extern声明

        如果只有声明没有定义:LINK错误 无法解析的外部符号

因此在一个项目内,一个全局变量尽量 仅在一处定义,可以多处无数次外部声明。

#include<stdio.h>
extern int age = 1;//当赋值后就起到了定义变量创建空间的作用,如果没有全局变量重名程序可正常执行。
    //此处extern关键字无效
void fun()
{
    printf("fun 里打印 %d\n",age);
}

 

总结 

 

 

大家的点赞、收藏、关注将是我更新的最大动力!欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容! 

<think>好的,用户想了解C语言局部变量全局变量作用域生命周期的区别。我需要先回顾一下相关概念,然后结合用户提供的引用内容来组织答案。首先,作用域指的是变量在代码中的可见范围,而生命周期则是变量存在的时间段。用户给的引用里提到作用域是空间上的,生命周期是时间上的。比如引用1说,当程序执行到某个模块时,局部变量开始存在,执行完就结束,这对应生命周期。而作用域则是固定的代码区域。接下来,局部变量全局变量的区别。根据引用2,局部变量全局变量同名时采用就近原则,优先使用局部变量。这说明局部变量作用域在其定义的块内,比如函数内部。而全局变量作用域是整个程序,从定义处开始到文件结束。引用3中的例子显示全局变量在程序运行期间一直存在,生命周期是全局的,而局部变量在函数调用时创建,结束后销毁。生命周期方面,引用1提到局部变量生命周期在进入作用域时开始,离开时结束。全局变量则在程序整个运行期间存在,如引用3中的global_var。此外,引用4中的静态局部变量,虽然作用域还是局部的,但生命周期延长到整个程序运行期间,这可能需要提到,但用户的问题可能没涉及,不过可以作为一个扩展点。需要注意用户可能混淆作用域生命周期,所以需要明确区分两者的定义。例如,静态局部变量作用域是局部的,但生命周期是全局的,这能帮助理解两者的不同。 然后,我需要组织答案的结构,先分别解释局部变量全局变量作用域生命周期,再对比它们的区别。可能用表格或分点说明更清晰。引用中的例子可以作为示例代码,比如引用2的同名变量示例,引用3的全局变量示例。 还要注意用户可能对作用域的具体范围不清楚,比如块作用域(如循环、条件语句中的变量)函数作用域的区别。局部变量通常是在函数或块内定义,而全局变量在函数外定义。最后,生成相关问题,比如作用域生命周期的关系,静态变量的作用域生命周期,或者如何避免变量名冲突等。根据用户之前的提问习惯,可能对实现细节或应用场景感兴趣。需要确保回答准确,引用正确的例子,并且用用户提供的引用标注来源。比如引用1引用3关于生命周期作用域的说明,引用2关于同名变量的处理。</think>### C语言局部变量全局变量作用域生命周期对比 --- #### **一、作用域生命周期的核心概念** 1. **作用域** - 定义:变量在代码中的可见范围(空间维度) - 分类: - **块作用域**:在`{}`内定义的变量(如函数、循环、条件语句中的局部变量) - **文件作用域**:在函数外定义的全局变量,从定义处到文件结束均可访问[^3] 2. **生命周期** - 定义:变量从创建到销毁的时间段(时间维度) - 分类: - **自动生命周期**:局部变量在进入作用域时创建,离开时销毁[^1] - **静态生命周期**:全局变量或静态变量(如`static`修饰的变量)在程序运行期间始终存在[^3][^4] --- #### **二、局部变量全局变量对比** | **特性** | **局部变量** | **全局变量** | |----------------|---------------------------------------|---------------------------------------| | **定义位置** | 函数或代码块内部 | 函数外部 | | **作用域** | 仅限定义它的代码块内[^1] | 整个程序文件(从定义处开始)[^3] | | **生命周期** | 进入作用域时创建,离开时销毁[^1] | 程序启动时创建,结束时销毁[^3] | | **存储位置** | 栈内存 | 静态存储区 | | **初始化** | 未初始化时值为随机数 | 未初始化时默认值为0[^4] | | **命名冲突** | 优先使用最近的局部变量(就近原则)[^2] | 需避免局部变量同名 | --- #### **三、关键示例解析** 1. **局部变量作用域** ```c #include <stdio.h> void func() { int x = 10; // 局部变量x,作用域仅在func函数内 printf("%d\n", x); } int main() { func(); // 输出10 // printf("%d\n", x); // 错误:x在此不可见 return 0; } ``` 2. **全局变量局部变量同名** ```c #include <stdio.h> int global = 2020; // 全局变量 int main() { int global = 2022; // 局部变量覆盖全局变量 printf("%d\n", global); // 输出2022[^2] return 0; } ``` 3. **静态局部变量** ```c #include <stdio.h> void counter() { static int count = 0; // 静态局部变量生命周期全局 count++; printf("%d\n", count); } int main() { counter(); // 输出1 counter(); // 输出2 return 0; } ``` --- #### **四、核心区别总结** | **维度** | **局部变量** | **全局变量** | |----------------|---------------------------------------|---------------------------------------| | **作用域** | 限定在代码块内 | 整个文件(跨函数访问) | | **生命周期** | 随代码块执行开始/结束 | 程序运行全程存在 | | **内存管理** | 栈内存自动回收 | 静态存储区需手动管理 | | **数据共享性** | 无法跨函数共享 | 可被多个函数共享[^4] | --- #### **五、注意事项** 1. **避免全局变量滥用**:全局变量易引发命名冲突程序耦合性过高[^2] 2. **静态局部变量的特殊性**:作用域仍为局部,但生命周期延长至程序结束[^4] 3. **作用域嵌套规则**:内层作用域可覆盖外层同名变量(如循环中的临时变量) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值