内存分布不同
- 全局变量:
- 静态存储区:全局变量存储在静态存储区。在程序开始执行时,系统就为全局变量分配内存空间,直到程序结束才释放。例如,下面代码中的
globalVar
:
#include <iostream>
int globalVar = 10;
int main() {
std::cout << "globalVar: " << globalVar << std::endl;
return 0;
}
- 初始化:未初始化的全局变量会被自动初始化为0(对于基本数据类型)。例如
int globalUninit;
,globalUninit
的值为0。
- 局部变量:
- 栈区:一般情况下,局部变量在函数被调用时在栈上分配内存空间,函数结束时,这些局部变量所占用的栈空间被释放。例如下面代码中的
localVar
:
#include <iostream>
int main() {
int localVar = 20;
std::cout << "localVar: " << localVar << std::endl;
return 0;
}
- 初始化:局部变量不会自动初始化,其值是不确定的(如果未显式初始化)。例如
int localUninit;
,localUninit
的值是不确定的,在使用前需要初始化。
内存生命周期差异
- 全局变量:
- 全局变量的生命周期贯穿整个程序。从程序启动开始,它就存在于内存中,直到程序结束才被销毁。例如:
#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
,它的值在程序运行期间是持续有效的,并且一直占据内存空间,直到程序结束。
- 局部变量:
- 局部变量的生命周期从定义它的语句处开始,到包含它的代码块结束时结束。例如:
#include <iostream>
void func() {
{
int localVar = 20;
std::cout << "In inner block, localVar: " << localVar << std::endl;
}
// 这里无法访问localVar,因为它的生命周期已结束
}
int main() {
func();
return 0;
}
- 在上述代码中,
localVar
在内部代码块结束后就被销毁,内存空间被释放,之后无法再访问。