全局变量和局部变量是面试时常问的问题之一,我曾在夏令营面试和就业面试中不止一次的被问到。在这里我总结归纳一下两者的区别。
在内存中的区别
这是最重要的区别。全局变量(外部变量和静态变量)保存在内存的全局存储区(静态存储区)中,占用静态的永久性的存储单元;局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。
C语言经过编译之后将内存分为以下几个区域:
(1)栈(stack):由编译器进行管理,自动分配和释放。在函数被调用时,空间分配给函数的参数、局部变量、返回值以及函数返回地址。执行完该函数后,内存空间自动释放。
(2)堆(heap):用于程序动态申请分配和释放空间—在程序执行期间分配内存,内存区域中的这个空间称为堆。C语言中的malloc和free,C++中的new和delete均是在堆中进行的。一般程序员申请的空间在使用结束后应该申请释放,若程序员没有释放空间,则程序结束时系统自动回收。堆中的内存是由编程人员控制的。
使用动态内存很明显的好处就是:不需要预先分配存储空间且分配的空间可以根据程序的需要扩大或缩小,这样可以有效的使用内存空间。
(3)全局(静态)存储区:分为DATA段和BSS段。DATA段存放初始化的全局变量和静态变量;BSS段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。
(4)文字常量区:存放常量字符串。程序结束后由系统释放。
(5)程序代码区:存放程序的二进制代码。
其他区别:
- 作用域不同:
局部变量定义在函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效。
全局变量所有的函数外部定义的变量,它的作用域是整个程序。
-
生命期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了
-
使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量。
889





