MST
星途 面试题库

面试题:C++中全局变量与局部变量内存分布区别相关问题

在C++中,详细阐述全局变量和局部变量在内存分布上有哪些不同?并举例说明它们在内存生命周期方面的差异。
46.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

内存分布不同

  1. 全局变量
    • 静态存储区:全局变量存储在静态存储区。在程序开始执行时,系统就为全局变量分配内存空间,直到程序结束才释放。例如,下面代码中的globalVar
#include <iostream>
int globalVar = 10;
int main() {
    std::cout << "globalVar: " << globalVar << std::endl;
    return 0;
}
  • 初始化:未初始化的全局变量会被自动初始化为0(对于基本数据类型)。例如int globalUninit;globalUninit的值为0。
  1. 局部变量
    • 栈区:一般情况下,局部变量在函数被调用时在栈上分配内存空间,函数结束时,这些局部变量所占用的栈空间被释放。例如下面代码中的localVar
#include <iostream>
int main() {
    int localVar = 20;
    std::cout << "localVar: " << localVar << std::endl;
    return 0;
}
  • 初始化:局部变量不会自动初始化,其值是不确定的(如果未显式初始化)。例如int localUninit;localUninit的值是不确定的,在使用前需要初始化。

内存生命周期差异

  1. 全局变量
    • 全局变量的生命周期贯穿整个程序。从程序启动开始,它就存在于内存中,直到程序结束才被销毁。例如:
#include <iostream>
int globalVar = 10;
void func() {
    std::cout << "In func, globalVar: " << globalVar << std::endl;
}
int main() {
    func();
    std::cout << "In main, globalVar: " << globalVar << std::endl;
    return 0;
}
  • 无论在哪个函数中访问globalVar,它的值在程序运行期间是持续有效的,并且一直占据内存空间,直到程序结束。
  1. 局部变量
    • 局部变量的生命周期从定义它的语句处开始,到包含它的代码块结束时结束。例如:
#include <iostream>
void func() {
    {
        int localVar = 20;
        std::cout << "In inner block, localVar: " << localVar << std::endl;
    }
    // 这里无法访问localVar,因为它的生命周期已结束
}
int main() {
    func();
    return 0;
}
  • 在上述代码中,localVar在内部代码块结束后就被销毁,内存空间被释放,之后无法再访问。