一、简介
C语言代码中的变量大致分两类,全局变量和局部变量;全局变量分为普通全局变量和静态全局变量,局部变量分为普通局部变量和静态局部变量。
-
普通局部变量
-
静态局部变量
-
普通全局变量
-
静态全局变量
二、局部变量
2.1 普通局部变量
普通局部变量,也称局部变量,作用域在其定义的函数内;它的生命周期是,函数进入时创建,函数退出时消亡,其存储(内存)区域在栈中。
如下图中,局部变量wPinInfo是进入此函数时创建,退出函数时消亡,别的函数无法使用这个变量。
2.2 静态局部变量
静态局部变量(普通局部变量前加static关键字),和普通局部变量一样在函数内定义,作用域在其定义的函数内;但不像普通局部变量,退出函数时会消亡,它始终存在着,其生存周期为整个源程序,其存储(内存)区域在全局(静态)变量区。
如下图中,静态局部变量s_wPinInfor[2],第一次进入该函数时被创建,退出函数时依然存在且保存了被调用后留下的值,再次调用此函数时,进入函数时,此变量保持着上次调用后的值,直到该值被此函数更改。
【注】静态局部变量使用中需要注意的问题是,若上图该函数被程序调用,在执行过程中被某中断函数打断,而在中断函数中此函数也刚好被调用,那么退出中断时,s_wPinInfo[2]的值保留了中断处理调用后留下的值,那么重新回到被打断时的该函数中,可能会导致s_wPinInfo[2]的值不是这次调用期望的值;即此变量存在着资源访问竞争,而普通局部变量不会有该问题。
三、全局变量
局变量,通俗的理解,就是其在全局也即整个文件中发挥作用,从其作用域理解,定义在函数体外部,或者主函数的外部,它的生命周期是在程序运行时创建,在程序退出时消亡,其存储(内存)区域在全局(静态)变量区。
3.1 普通 /静态全局变量的区别
-
普通/静态全局变量定义的区别是,静态的加static关键字
-
若程序由多个源文件构成,普通全局变量作用域是全部源文件;静态全局变量作用域为定义该变量的源文件,即对组成该程序的其它源文件是无效的。
-
不同源文件的静态全局变量可使用相同变量名,彼此相互独立,互不影响。
-
若程序仅由一个源文件构成时,全局变量与全局静态变量没有区别。
【注】全局变量和静态局部变量一样,存在着资源访问竞争问题。
四、对比表
变量 | 生命周期 | 作用域 | 默认值 | 内存区域 |
普通局部变量 | 函数进入时创建,函数退出时消亡 | 函数内 | 随机值 | 栈 |
静态局部变量 | 函数进入时创建,程序退出时消亡 | 函数内 | 0 | 全局(静态)变量区 |
普通全局变量 | 程序运行时创建,程序退出时消亡 | 程序所有源文件 | 0 | 全局(静态)变量区 |
静态全局变量 | 程序运行时创建,程序退出时消亡 | 定义的源文件 | 0 | 全局(静态)变量区 |