C语言 局部变量与全局变量的生存期

本文深入探讨了变量的声明与定义的区别,详细解释了局部变量和全局变量的概念、作用域及内存分配方式,包括自动分配、静态分配和动态分配的特点,并讨论了跨文件使用的extern关键字及静态全局变量的作用域限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


定义与声明的区别:把建立存储空间的变量声明称定义,而把不需要建立存储空间的声明称为声明

静态局部变量,只有定义,没有声明。如果定义时没有赋值,默认其值为0

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190801195327885.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzIwMjYzNQ==,size_16,color_FFFFFF,t_701在这里插入图片描述

1.局部变量
仅仅在定义它的函数的内才能有效使用,其作用域仅限在函数体内,即从变量定义的位置开始,到函数体结束。

2.局部变量的内存分配:
通常,编译器不为局部变量分配内存单元,而是在程序运行中,当局部变量所在的函数被调用时,系统根据需要临时为其分配内存。当函数执行结束时,局部变量被撤销,占用内存被收回。

注意:
局部变量在函数被调用时由系统分配存储区,在不同的声明周期的函数中同名的变量实际上在内存中占不同的单元,因此在不同的函数中可以定义相同名字的局部变量。生命周期相同的函数的同名局部变量,占用不同的内存单元。

总结:这种内存分配方式叫自动分配内存,对于自动分配(栈分配),变量与其所在的代码块共存亡。

补充:
对于静态分配编译器预分配),变量与程序共存亡,程序开始执行时即已存在,一致到程序运行完毕退出后才撤销。

静态分配,生命周期就是整个程序执行周期,内存会一直存在,main函数执行之前就创建,无论函数如何运行,如何调用,内存一直不会被回收,一直到程序结束才被系统回收。


动态分配的生存期,从malloc开始,free结束。

动态分配和静态分配的区别

静态分配一般在栈上,系统自己分配和回收内存。动态分配在堆上,由程序员自己决定分配和回收内存。


跨文件使用:结合extern关键字,调用其他文件中的变量。
static声明的变量只能在本文件中使用。


3.全局变量
在函数外定义的变量称为全局变量,也称外部变量,全局变量的作用域较广,全局变量不属于任何一个函数,理论上可被其作用域中的所有函数访问,因此,提供了一个不同函数间联系的途径,使函数间的数据联系不只局限于参数传递和return语句。

全局变量的作用域就是从其定义处到源文件结束,调用全局变量不能超出其作用域。

全局变量一经定义,编译器会为其分配固定的内存单元,在程序运行期间,这块内存单元始终有效,一直到程序执行完毕才由操作系统收回该块内存

全局变量:extern变量又称全局变量,放在静态存储区,所谓全局,是说该变量可以在程序的任意位置使用,其作用域是整个程序代码范围内,可以被程序其他函数所引用,不仅仅局限在本文件。


5. 全局变量的声明与定义在函数外部:
Int num 就会被解析为extern int num;
Int num = 10就会被解析为 extern int num =10;

6. 全局变量定义的基本格式为:
extern 类型 变量名 = 初始化表达式 ;
此指令通知编译器在静态存储区中开辟一块指定类型大小的内存区域,用于存储该变量
例如:创建了一个初始值为100的int型全局变量m:
extern int m=100;

7.C语言规定,只要是在外部,即不是在任何一个函数内定义的变量,编译器就将其当作全局变量,无论变量定义前是否有extern说明符

8.全局变量仅有声明,没有赋值,调用时会报错

extern作用域是本程序的所有源代码文件,只要在一个文件中定义,在其他文件中使用时只要对其进行声明即可。
静态全局变量其作用域仅限于从定义位置起到本文件结束的一段代码区域,不能被其他文件中的函数所使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值