局部变量和全局变量(静态和非静态)区别

全局变量和全局静态变量的区别

(1)全局变量是不显式用 static 修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过 extern 全局变量名的声明,就可以使用全局变量。
(2)全局静态变量是显式用 static 修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用 extern 声明也不能使用。

静态全局变量有以下特点:

(1)静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量;
(2)未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为 0);
(3)静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的。
优点:静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突。

普通局部变量与静态局部变量的区别

内存分配和释放
1、普通局部变量只有执行到变量定义的语句的时候才分配空间。
2、static局部变量在编译阶段(函数还没有执行),变量的空间已经分配。
3、普通局部变量离开作用域{},自动释放其空间,也就无法使用此变量。
4、static局部变量只有在整个程序结束的时候才将其自动释放。
初始化
1、普通局部变量不初始化,为随机值。
2、static局部变量不初始化,为0。
3、static局部变量初始化语句只有第一次执行时有效,但是可以赋值多次。
4、static局部变量只能用它常量初始化。

静态局部变量有以下特点:

(1)该变量在全局数据区分配内存;
(2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
(3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为 0;
(4)它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。(延长了局部变量的生命周期)

4个变量之间的对比

变量修饰符作用范围内存分配生命周期未初始化
局部变量所在函数执行时分配离开作用域{},自动释放其空间随机数
局部静态变量static所在函数提前分配程序执行结束0
全局变量在extern声明时可以在整个工程里调用执行时分配程序执行结束随机数
全局静态变量static所定义的文件内提前分配程序执行结束0
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页