C语言积累整理---全局变量、局部变量、作用域、变量的存储方式和生命周期

本文详细介绍了C语言中变量的作用域,包括局部变量、全局变量和静态变量的范围。同时,讲解了变量的存储方式,如静态存储和动态存储,以及不同存储类别的生命周期。全局变量在整个工程中有效,静态全局变量限制在定义文件内。局部变量在函数调用时分配,函数结束时释放,而静态局部变量在整个程序执行期间存在。理解这些概念有助于更好地管理C程序中的变量和内存分配。

一、作用域

1、作用域问题:在一个函数中定义的变量,在其他函数中能否被引用?在不同位置定义的变量,在什么范围内有效?

2、定义变量可能有3种情况 [谭浩强]

(1)在函数的开头定义;

(2)在函数内的复合语句内定义;

(3)在函数的外部定义。

3、局部变量

(1)在函数内部定义的变量,只有在本函数内才能引用它们,也只有在本函数范围内有效;

(2)在复合语句内定义的变量,只有在本复合语句内才能引用它们,也只有在本复合语句范围内有效;

(3)举例如下,两个函数中的tmp只作用域在自己的函数体内。
 

#include <stdio.h>
 
void cpri()
{
	char tmp= '6';
	printf("cpri: %c\n", tmp);
}
 
void ipri()
{
	int tmp = 666;
	printf("ipri: %d\n", tmp);
}
 
int main()
{
	cpri();
	ipri();
	return 0;
}



运行结果
cpri: 6
ipri: 666

4、全局变量

(1)在函数之外定义的变量是全局变量。

(2)C程序设计中,一般习惯将全局变量名的首字母大写。

(3)尽力减少使用全局变量的原因

        a、内存开销大,全局变量在程序整个执行过程中都占有存储单元;

        b、降低函数的通用性,不利于函数作为一个功能模块拷贝到别的文件中复用;

        c、代码的可阅读性降低,人们难以清楚的判断出每个瞬时,各个外部变量的值。
 

程序的内存分配


一个由c/C++编译的程序占用的内存分为以下几个部分


1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。


2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。


3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss)。 - 程序结束后由系统释放。


4、文字常量区 —常量字符串就是放在这里的(.rodata)。 程序结束后由系统释放。


5、程序代码区—存放函数体的二进制代码(.text)。

C语言中的全局变量包括外部变量和静态变量,均是保存在全局存储区中,占用永久性的存储单元;

局部变量,即自动变量,保存在栈中,只有在所在函数被调用时才由系统动态在栈中分配临时性的存储单元

一、从作用域看:

全局变量:其作用范围是“整个工程”,只需在一个源文件中定义,就可以作用于所有的源文件。

                  当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量

<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
发出的红包

打赏作者

小路科技

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

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

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

打赏作者

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

抵扣说明:

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

余额充值