为什么 'main' 函数中的局部 int 变量会自动初始化?

Why local int variables inside `main` function will be initialized automatically?

本文关键字:变量 初始化 函数 main 为什么 局部 int      更新时间:2023-10-16

我是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_funca是意料之中的。但是,有人可以告诉我为什么main函数中的a被初始化为0

提前感谢!

未初始化并不意味着非零,它可以有任何值。在许多操作系统上,新分配的内存页充满了0因此在非调试代码中,未初始化的值通常也会0

程序的行为是未定义的,但可能发生的情况是,main中的a要么是堆栈的第一次使用,要么您只是很幸运,并且在main离开堆栈该区域之前运行的初始化代码0

cout的调用将写入堆栈,因此当您执行another_func堆栈内存时,堆栈内存将不再全部0

该标准不需要局部变量的默认零值,但某些编译器可能会执行零初始化

除非另有显式初始化,否则只有global变量和static成员必须初始化为零。

tl;dr:您不得读取未初始化的值。

两个a都没有初始化为任何东西。这意味着它们有一个不确定的值,可以是包含 0 的任何值。任何推理都必须在这里停止,因为从未初始化的值读取会调用未定义的行为 (UB(。

UB意味着任何事情都可能发生。您的程序无效,您不再保证任何事情。您不允许读取a,因此推理为什么在特定情况下读取特定值是没有用的。

这就是C++语言的观点。对于编写C++程序,这通常是您需要自己采用的观点。当然,这涉及到一个编译器。更具体地说,具有特定配置的特定版本中的某个编译器为特定平台编译了这段确切的代码。包括所有这些,您可以对为什么看到特定结果进行一些调查。如果您对编译器的工作方式感兴趣,这是一件有用的事情。但它很少有助于编写程序。更改编译器标志或使用略有不同的代码段,结果可能会有所不同。