【C++基础部分】全局变量和局部变量有什么区别?操作系统和编译器是怎么知道的?

本问题对应文章链接:C++常见面试题整理

共以下 1 个回答

  • Thaddeus 永久会员 2023年8月15日 下午7:44

    1、全局变量和局部变量有什么区别?

    (1.)作用域

    • 全局变量:整个程序或文件范围,可以被程序中的任何函数或代码块访问和使用。
    • 局部变量:限定在特定的代码块内部,例如函数、循环等,只能在其定义的代码块内部被访问和使用。

    (2.)生命周期

    • 全局变量:在程序开始执行时创建,并且在程序结束时销毁(释放其占用的内存)。
    • 局部变量:从其定义位置创建,到其所属的代码块执行完毕后销毁。

    (3.)在内存中位于的分区

    • 全局变量:全局/静态存储区(Global/Static Storage)。
    • 局部变量:栈区 (Stack)。

    (4.)使用时注意

    • 全局变量可以在程序中的任何地方被访问和修改,同时也增加了潜在的命名冲突和风险。而局部变量只能在其所属的代码块内部进行访问和修改。这种限制提供了更好的封装性和安全性,因为它们不会被其他代码块误用或更改,且在函数或代码块内部,同名时编译器优先使用局部变量
    • 因此,根据良好的程序设计原则,在函数中尽量避免使用全局变量,而是优先使用传递函数参数的方式传递变量值。这样可以提高代码的可读性、可维护性和重用性


    2、操作系统和编译器是怎么知道的?

    (1.)操作系统并不直接参与全局变量和局部变量的区分,它仅负责在程序执行时为变量提供存储空间,并确保其正确访问和管理。

    (2.)编译器会根据作用域规则来区分全局变量和局部变量。在编译阶段,编译器会将全局变量标记为具有全局作用域,将局部变量标记为具有局部作用域。

    (3.)符号表:一个数据结构,用于存储程序中所有标识符(如变量名、函数名等)的相关信息,包括其名称、类型、作用域等。在编译过程中,编译器会建立符号表来跟踪和管理这些标识符

    (3.)所谓的“标记”,实际上是编译器会把全局变量和局部变量的信息加入到符号表中,这些信息就包括二者的作用域。因此编译器通过查找符号表来确定变量的作用域,进而区分是全局变量还是局部变量。

    0 赞同 0 条回复

# 回答此问题

后才能回答