为什么 'main' 函数中的局部 int 变量会自动初始化?
Why local int variables inside `main` function will be initialized automatically?
我是C++新手,在学习C++时遇到了这个问题。
这是代码
#include <iostream>
using namespace std;
void another_func() {
int a;
cout << a << endl;
}
int main() {
int a;
cout << a << endl;
another_func();
}
我正在使用g++ (GCC) 10.1.0
,我发现每次运行代码时,main
函数内的a
都会初始化为0
,而another_func
中的a
将是一个随机数。如下
➤ g++ test.cpp && ./a.out
a in main: 0
a in another_func: 32612
据我所知,局部变量存储在堆栈中,它们没有自动初始化机制。因此,another_func
a
是意料之中的。但是,有人可以告诉我为什么main
函数中的a
被初始化为0
?
提前感谢!
未初始化并不意味着非零,它可以有任何值。在许多操作系统上,新分配的内存页充满了0
因此在非调试代码中,未初始化的值通常也会0
。
程序的行为是未定义的,但可能发生的情况是,main
中的a
要么是堆栈的第一次使用,要么您只是很幸运,并且在main
离开堆栈该区域之前运行的初始化代码0
。
对cout
的调用将写入堆栈,因此当您执行another_func
堆栈内存时,堆栈内存将不再全部0
。
该标准不需要局部变量的默认零值,但某些编译器可能会执行零初始化
除非另有显式初始化,否则只有global
变量和static
成员必须初始化为零。
tl;dr:您不得读取未初始化的值。
两个a
都没有初始化为任何东西。这意味着它们有一个不确定的值,可以是包含 0 的任何值。任何推理都必须在这里停止,因为从未初始化的值读取会调用未定义的行为 (UB(。
UB意味着任何事情都可能发生。您的程序无效,您不再保证任何事情。您不允许读取a
,因此推理为什么在特定情况下读取特定值是没有用的。
这就是C++语言的观点。对于编写C++程序,这通常是您需要自己采用的观点。当然,这涉及到一个编译器。更具体地说,具有特定配置的特定版本中的某个编译器为特定平台编译了这段确切的代码。包括所有这些,您可以对为什么看到特定结果进行一些调查。如果您对编译器的工作方式感兴趣,这是一件有用的事情。但它很少有助于编写程序。更改编译器标志或使用略有不同的代码段,结果可能会有所不同。
- 为什么C++有不同的变量初始化方式?
- 静态 constexpr 成员变量初始化
- C++不同的变量初始化
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 是变量初始化失败吗?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 类静态变量初始化顺序
- 使用 constinit 变量初始化 constexpr 变量
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用默认构造函数引用成员变量初始化错误
- 宏的 if 语句中的变量初始化
- 不稳定的C :每行适应性变化多变量初始化
- 同一函数中的静态函数变量初始化顺序
- C 语言中的静态变量初始化
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 类POD成员变量初始化
- 尝试捕获类变量初始化的范围
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 多变量初始化编译器支持