#include <iostream>
using namespace std;
bool a[5];
int main()
{
for (int i = 0; i < 5; i++)
{
cout<<a[i]<<" ";
}
return 0;
}
以上代码中输出为0 0 0 0 0
,但是下面代码输出却是不确定的.这是为什么?
#include <iostream>
using namespace std;
int main()
{
bool a[5];
for (int i = 0; i < 5; i++)
{
cout<<a[i]<<" ";
}
return 0;
}
输出176 74 183 230 255
2 つのコードの A はデフォルトで初期化されます。違いは、グローバル変数 a はデフォルトの初期化の前に最初にゼロ初期化されるのに対し、ローカル変数 a は初期化されないことです。ローカル変数が 0 に初期化されないことを意味します)。同時に、このデフォルトで初期化されたローカル変数 a の値は不確かです。したがって、ここでのグローバル変数 a の値は 0 であり、ローカル変数 a の値は不確かです。
変数が実際に 0 に初期化されるかどうかは、変数の保存期間に関係します。静的変数は初期化前に 0 に初期化されますが、自動変数は初期化されません。
未定義のグローバル変数は 0 に初期化されますが、関数内で宣言されたローカル変数にはこの規則がないためです
一般に、グローバル変数と静的変数はデータセグメントに配置され、ローカル変数はスタックに配置されます。
データセグメントはコンパイル中に決定され、実行可能ファイルに割り当てられるため、必ず初期化されます。
スタックに関しては、実行時に割り当てられることがわかっています。関数を開始すると、レジスタがスタックにプッシュされるだけでなく、一時変数にもスタック領域が割り当てられるため、ローカル変数はスタック アドレスに対応します。スタックはメモリ上で大きく変化するため、初期値は不確かです。
もちろん、C++ 標準ではコンパイラが変数を配置する領域を指定していませんが、一般的にはこのように実装されています。